gpt4 book ai didi

java - 如何避免异常阴影?

转载 作者:行者123 更新时间:2023-12-03 10:04:28 24 4
gpt4 key购买 nike

当在处理异常期间发生异常时,仅报告最后一个异常,因为我只能向Error对象添加一个异常。如何在最终错误消息中报告所有异常?
例子:

class main
{
public static void main (String[] args)
{
try {
// Database.insert ();
throw new Exception ("insert failed");
}
catch (Exception ex1) {
try {
// Database.rollback ();
throw new Exception ("rollback failed");
}
catch (Exception ex2) {
throw new Error ("Can not roll back transaction.", ex2);
}
}
finally {
try {
// Database.close ();
throw new Exception ("close failed");
}
catch (Exception ex3) {
throw new Error ("Can not close database.", ex3);
}
}
}
}
在该示例中,所有操作均失败。数据库插入导致 ex1。回滚导致 ex2。关闭数据库会导致 ex3。当程序被执行时,在 ex3对象中仅报告最后一个 Error。如何在 ex1对象中同时包含 ex2ErrorError的构造函数仅接受一个异常。

最佳答案

我建议您将Java 7中引入的try-with-resource-statements与AutoCloseable -interface结合使用。

Sidenote: The Connection, Statement and ResultSet from java.sql all implement AutoCloseable

try (Connection c = DriverManager.getConnection(url)) {
// do your inserts
} catch (Exception e) {
throw new Error("Insert failed", e);
}
这将适本地关闭您的 connection或通常传递的 AutoCloseable。并且将使用 Throwable.addSuppressed()方法处理异常的阴影。
this other question上可以看到以前版本中的等效内容

您的问题还提到了我没有涉及的回滚。这可以通过使用前面提到的 Throwable.addSuppressed()方法(如tobias_k的 pointed out in the comments)来完成,尽管说实话,它变得更加困惑,并且看起来不再那么好了:
Exception insertException = null;
try (Connection c = DriverManager.getConnection(url)) {
try {
// do your inserts
} catch (Exception e1) {
insertException = e1;
// do your rollback
}
} catch (Exception e2) {
Error error = new Error("Insert failed", insertException);
error.addSuppressed(e2);
throw error;
}
只是为了澄清起见,只有在插入失败时才能访问内部 catch -block。当以下任何情况引发异常时,可以到达外部 catch的位置:
  • DriverManager.getConnection()
  • 您的回滚
  • Connection.close()

  • 对于小型演示,您可以访问此 link,它说明了stacktrace的外观。

    关于java - 如何避免异常阴影?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63611752/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com