我愿意用一个特定的函数处理一些错误,用另一个函数处理其他一些错误。有没有办法在 Delphi 中做到这一点而不重复整个“on E:X do”块?
例如,我有以下代码:
try
someProcedure()
except
on E:Error1 do
thisFunction(E)
on E:Error2 do
thisFunction(E)
on E:Exception do
thatFunction(E)
end;
Run Code Online (Sandbox Code Playgroud)
是否可以用类似于以下的任何方式编写,避免重复thisFunction
?
try
someProcedure()
except
on E:Error1, Error2 do
thisFunction(E)
on E:Exception do
thatFunction(E)
end;
Run Code Online (Sandbox Code Playgroud)
不,该语法是不可能的,正如您在文档中所见。这个限制其实是合理的。确实,如果允许使用这种语法,E
变量将具有什么类型?
但是,您可以使用类层次结构来实现相同的效果。(如果您可以控制异常类,那就是。如果它在逻辑上有意义。)
例如,如果
type
EScriptException = class(Exception);
ESyntaxError = class(EScriptException);
ERuntimeError = class(EScriptException);
EDivByZeroError = class(ERuntimeError);
EAverageOfEmptyList = class(ERuntimeError);
Run Code Online (Sandbox Code Playgroud)
然后
try
except
on E: ESyntaxError do
HandleSyntaxError(E);
on E: EDivByZeroError do
HandleRuntimeError(E);
on E: EAverageOfEmptyList do
HandleRuntimeError(E);
end;
Run Code Online (Sandbox Code Playgroud)
可以写
try
except
on E: ESyntaxError do
HandleSyntaxError(E);
on E: ERuntimeError do
HandleRuntimeError(E);
end;
Run Code Online (Sandbox Code Playgroud)
如果你不能像这样构造你的异常类(或者如果它在逻辑上没有意义),你当然可以按照
try
except
on E: ESyntaxError do
HandleSyntaxError(E);
on E: Exception do
if (E is EDivByZeroError) or (E is EAverageOfEmptyList) then
HandleRuntimeError(E);
end;
Run Code Online (Sandbox Code Playgroud)
事实上,如果您愿意,您可以捕获Exception
基类的异常并获得对处理的完全编程控制:
try
except
on E: Exception do
if E is ESyntaxError then
HandleSyntaxError(E)
else if (E is EDivByZeroError) or (E is EAverageOfEmptyList) then
HandleRuntimeError(E)
else
raise;
end;
Run Code Online (Sandbox Code Playgroud)
(但要注意:如果在最后一行之前添加尾随分号会发生什么else
?)
归档时间: |
|
查看次数: |
227 次 |
最近记录: |