转换以集中方式从外部库引发的异常

时间:2016-10-11 10:31:24

标签: java exception-handling

我想问一下围绕Java Exceptions的代码风格问题。我正在使用Java来使用JNI调用C / C ++库。我正在使用的库中的约定是我可以调用的大多数方法将为所有错误抛出相同的异常类型。让我们称之为LibException。现在,LibException实际上是一个包装器异常,可能出现大量错误,包括身份验证问题,连接问题或更严重的问题,例如损坏的输入等.LibException还包含错误代码int以及错误描述字符串。

更令人困惑的是,如果我在回调中将它扔到库中,LibException也可以包装我自己的一个异常!我的意思是我有时提供一个回调方法,它由库调用,我有时必须在回调中抛出一个异常。在这种情况下,库会获取异常,将其包装在LibException中并在原始方法调用中将其抛回给我。

我希望每个基本问题的处理方式不同。需要向用户显示身份验证问题,以便他可以重试,应该通知用户连接问题,但更严重的问题可能必须触发我的诊断报告系统(一种自动机制,可以发送部分日志文件进行调试)和当然,我在回调中向库中抛出的任何异常都需要作为原始异常类型重新抛出。

由于我在多个位置调用不同的方法,我认为在LibExceptions的异常处理周围放置一些结构是个好主意。这是为了避免代码重复,但最重要的是要确保正确处理不同的异常类型,并且未来我不会忘记,例如,通知用户身份验证失败。

我尝试了很多方法,但我对我得到的代码结构并不完全满意,所以我想了解社区最佳实践的一些想法。

  1. 静态方法,包括对异常进行排序并抛出一堆其他异常的逻辑 public static void handleException(LibException e)抛出AuthenticationException,ConnectionException,SeriousException,MyException(MyException将是我抛出回调的异常)

    • + ve这很有效,因为它强制处理所有抛出的异常。
    • + ve如果添加了新的异常类型,编译器将强制我处理新的异常
    • -ve尽管handleException()是一个总是抛出异常的方法,但编译器(正确地)并不知道这一点。这意味着如果我们在必须返回某个东西的方法中使用handleException(),编译器会抱怨错过了返回类型。为了使编译器满意,我必须在调用handleException()之后立即抛出另一个异常,以便编译器理解它不会获得返回值,因为肯定会抛出异常。
    • -ve我不喜欢看起来像Handler.handleException(libEx)的行,因为它引发了一堆异常并不是很明显。
    • -ve很难根据发生异常的位置(即我们无法连接到哪个URL)自定义异常消息。
  2. 返回包含我定义的不同类型异常的枚举的方法。基于枚举,我可以创建不同的抛出异常。 public static ExceptionTypeEnum Handler。

    • + ve由于我创建了异常,现在我可以使用额外的上下文自定义一些错误消息

    • -ve我仍然忘记处理枚举(特别是如果我将来创建一个新类别)

    • -ve我仍然需要一堆自定义代码来在我捕获LibException的每个地方创建异常
  3. 与#2类似,但我没有枚举返回,而是可以使用多种方法,例如isAuthenticationException(libEx)或isConnectionProblem(libEx),然后自行抛出异常。

    • -ve我肯定会忘记正确处理所有部分,尤其是在以后添加新的异常类型时。
  4. 异常处理程序可能会返回异常以引发异常。但是由于我们抛出了许多不同的异常,因此getException()方法必须返回Exception基类。这意味着异常处理程序必须事先知道可以抛出哪些异常,并且还要捕获Exception类,使我的异常处理更加困难。

  5. 现在,如果我把每个人都弄错了这个问题,我想我想要找到一个优雅的解决方案类似于第39节中描述的问题;检查异常不恰当地暴露实施细节'在页面http://www.ibm.com/developerworks/java/library/j-jtp05254/index.html

    社区是否有任何其他建议使用编码方法来正确优雅地处理这些LibExceptions?

0 个答案:

没有答案