Java中处理多个异常的最佳实践方式

4

针对以下情况,是否有最佳实践方法?我有一段代码块可以生成多种不同的异常,每个异常都通过隐藏对话框、显示错误消息和运行onDisconnect()方法来处理。但问题在于,对于每个异常,错误消息都需要不同。我认为有两种选择。第一种是捕获Exception,然后在catch块内使用instanceof来处理各种异常,如下所示:

    } catch (Exception e) {
        dialog.dismiss();

        String errorMessage = getString(R.string.default_error);
        if (e instanceof ArrayIndexOutOfBoundsException) 
            errorMessage = getString(R.string.bad_host); 
        else if (e instanceof UnknownHostException) 
            errorMessage = getString(R.string.unknown_host);
        else if (e instanceof NumberFormatException) 
            errorMessage = getString(R.string.bad_port);
        else if (e instanceof IOException)
            errorMessage = getString(R.string.no_connection);
        showError(errorMessage);

        onDisconnect();
    }

另一种选择是单独捕获所有内容,如下所示:
    } catch (ArrayIndexOutOfBoundsException e) {
        dialog.dismiss();
        showError(getString(R.string.bad_host));
        onDisconnect();
    } catch (UnknownHostException e) 
        dialog.dismiss();
        showError(getString(R.string.unknown_host));
        onDisconnect();
    } // ...etc.

有没有更好的方法来实现这个?我选择了第一种情况(至少目前是这样),因为它最小化了重复代码,但我也听说instanceofcatch (Exception)是魔鬼的作品。

4个回答

6

我的偏好是有一个类似这样的单独方法:

void handleException(String msg) {
   dialog.dismiss();
   showError(getString(msg));
   onDisconnect();
}

然后在你的代码中,就像这样抛出异常:

} catch (ArrayIndexOutOfBoundsException e) {
        handleException(getString(R.string.bad_host));
    } catch (UnknownHostException e) 
        handleException(getString(R.string.unknown_host));
    } // ...etc.

这个解决方案已经有一些评论了,但你比他们早几分钟就赢了。我喜欢这个解决方案,现在正在实施它。谢谢! - Haldean Brown
如果你不想添加一个新的处理方法,你可以在Java 7中这样做:try {...} catch (Exception1 | Exception2 ex) { ex.printStackTrace();} - Roger Jin

3
你想要分别捕获它们。如果你捕获通用异常,可能会捕获到意料之外的异常(例如从堆栈中其他地方推送上来的异常),并阻止它们向上传播到实际处理它们的位置。
(后续编辑):你还可以考虑使用finally来避免一些代码重复问题。

2

为处理错误创建一个(私有的void)方法。您可能需要传递一些关于正在发生的事情的参数,但行为将是一致的。当您更改该方法时,它会更改使用它的所有位置,因此您可以减少样板代码。

try {
   // stuff

} catch(OneException) {
    handleSimilarExceptions();
} catch(TwoException) {
    handleSimilarExceptions();
} catch(DifferentException) {
    log.write("Something wierd happened, handling it");
    somethingDifferent();
}

1

如果你做了类似修改第二个版本的事情:

   catch (ArrayIndexOutOfBoundsException e) {
        handleException(R.string.bad_host);
    } catch (UnknownHostException e) 
        handleException(R.string.unknown_host);
    } // ...etc.

  void handleException(String s) {
        dialog.dismiss();
        showError(getString(s));
        onDisconnect();
  }

我同意,像这样使用 instanceof 是撒旦的作品...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接