java - 多次或一次 try catch

标签 java exception-handling coding-style

我正在清理我的一些代码,但我不确定哪条路线会更好。

目前,我的大部分方法都有一个 try catch block ,它在最后处理一些单独的异常,但我认为拥有更多的 try catch block 会更好地进行维护。然而,在分解代码时,我发现我正在为同一类型的异常编写多个 block 。我可以看到为每个部分编写一个 block 的好处,因为我可以详细说明它失败的原因。

我的问题是……这样做有缺点吗?会不会有性能问题或其他一些我没有看到的隐藏怪物?

另外,在一个方法中处理多个异常的首选方法是什么,是否有行业标准?

为了更好地说明我的观点,这里有一些伪代码

//multiple try catch for same exception
try {
     //some code here
} catch (MyException e) {
     //specific error message here
}
try {
     //some different code here
} catch (MyException e) {
     //more specific error message indicating a different issue
}

最佳答案

这不是性能或个人偏好问题:这是一个功能和需求问题。

假设我写:

场景 1:

try
{
  doThingA();
}
catch (SomeException panic)
{
  System.out.println("doThingA failed");
}
try
{
  doThingB();
}
catch (SomeException panic)
{
  System.out.println("doThingB failed");
}

场景 2:

try
{
  doThingA();
  doThingB();
}
catch (SomeException panic)
{
  System.out.println("doThingA or doThingB failed");
}

这两种情况并不等同:它们做不同的事情。在场景 1 中,如果 doThingA 抛出异常,doThingB 仍会执行。在场景 2 中,如果 doThingA 抛出异常,则不会执行 doThingB。所以问题不在于哪个提供更好的性能或哪个代码更易读,而是如果 doThingA 失败,是否还应该执行 doThingB?

如果你真正想要的是第二种行为,但你想要不同的消息告诉用户出了什么问题,那么你应该抛出不同的异常,或者将消息的文本放入异常中,即

void doThingA() throws SomeException
{
  ... whatever code ...
  if (theWorldIsAboutToEnd)
    throw new SomeException("doThingA failed");
}

然后在 catch 子句中,不显示常量字符串,而是显示 SomeException.toString 或 SomeException.getMessage。

关于java - 多次或一次 try catch ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4555322/

相关文章:

c++ - 为什么标准不允许通过引用捕获不完整的异常类型?

python - 应用程序范围的异常处理程序是否有意义?

Java 异常堆栈跟踪不打印

python - 改进了编码,节省了如何检查Python中是否有两条线段交叉

c++ - 好的风格——返回枚举还是整数?

java - 在 C++ 这样的语言中 (a ^ (1 << b)) 实际上做了什么?

java - 为什么 String.split 以不同方式处理字符串的开始和结束部分?

java - 表达式预期错误

java - 我能否确定给定线程是否已由该线程或该线程的后代启动?

"empty lines"中的 Python 缩进