Delphi - 如何处理多个除类型

Gio*_*Col 2 delphi exception

我愿意用一个特定的函数处理一些错误,用另一个函数处理其他一些错误。有没有办法在 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)

And*_*and 6

不,该语法是不可能的,正如您在文档中所见。这个限制其实是合理的。确实,如果允许使用这种语法,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?)