Delphi中的C#/ Java"Try/Finally/Catch"等效构造

ash*_*999 15 delphi exception-handling

在Delphi中,你如何才能最终使用try,并一起使用?Java/C#等价物看起来像:

try {
    // Open DB connection, start transaction
} catch (Exception e) {
    // Roll back DB transaction
} finally {
    // Close DB connection, commit transaction
}
Run Code Online (Sandbox Code Playgroud)

如果你在Delphi中尝试这个,你可以使用try/finally或try/except; 但从来没有三个在一起.我想代码如下(不编译):

try
    // Open DB connection, start transaction
except on e: Exception do
begin
    // Roll back transaction
end
finally // Compiler error: expected "END" not "finally"
begin
    // Commit transaction
end
Run Code Online (Sandbox Code Playgroud)

mjn*_*mjn 18

在Delphi中,您可以使用以下模式:

// initialize / allocate resource (create objects etc.)
...
try
  try
    // use resource
    ...
  except
    // handle exception
    ...
  end;
finally
  // free resource / cleanup
  ...
end
Run Code Online (Sandbox Code Playgroud)

  • 除了它增加了不必要的缩进级别.我真的希望他们能够编写try..finally..except..end,如果按随机顺序(取决于首先处理的内容),甚至更好,如果有可能的话,那就更好了"尝试..除了A..finally..except B ... end".它在编码方面确实没那么多,并且不会给语言带来负担,但却增添了不错的触感. (2认同)
  • 好几次.典型的情况是需要销毁一些临时对象并处理异常.但由于这种模式的丑陋,人们通常只是在"try"和"except"子句中复制销毁代码. (2认同)

Eug*_*its 10

try 
  // allocate resource here
  try 
  finally
    // free resource here
  end;
except
  // handle exception here
end;
Run Code Online (Sandbox Code Playgroud)

  • mjustin的答案并没有捕获析构函数中的异常.这是更好的方法. (5认同)
  • 这几乎不重要,@ Gabr.如果析构函数抛出异常,那么你已经注定了.您的程序绝对没有办法解决导致此类错误的问题. (3认同)
  • 同样具有mjustin答案的功能,但我更喜欢他 - 它使得它更具可读性,首先捕获异常然后最后一个块结束.或者也许我只是偏见,因为这是Java/C#风格:) (2认同)