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

Java 以集中的方式转换从外部库引发的异常,java,exception-handling,Java,Exception Handling,我想问一个关于Java异常的代码风格问题。我正在使用Java调用一个使用JNI的C/C++库。我使用的库中的约定是,我可以调用的大多数方法都会对所有错误抛出相同的异常类型。我们称之为LibException。现在,LibException实际上是一个包装器异常,可以出现许多错误,包括身份验证问题、连接问题或更严重的问题,如输入损坏等。LibException还包含错误代码int以及错误描述字符串 更让人困惑的是,如果我在回调中将LibException抛出到库中,LibException还可以包

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

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

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

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

我尝试了很多方法,但是我对我得到的代码结构不太满意,所以我想从社区获得一些关于最佳实践的想法

  • 静态方法,包括对异常进行排序和抛出一组其他异常的逻辑 publicstaticvoidhandleexception(LibException e)抛出AuthenticationException、ConnectionException、SeriousException、MyException(MyException将是我在回调中抛出的异常)

    • +这项工作很好,因为它强制处理所有抛出的异常
    • +ve如果添加了新的异常类型,编译器将强制我处理新的异常
    • -ve即使handleException()是一个总是抛出异常的方法,编译器(正确地)也不知道这一点。这意味着,如果我们在必须返回某些内容的方法中使用handleException(),编译器会抱怨缺少返回类型。为了让编译器满意,我必须在调用handleException()之后立即抛出另一个异常,这样编译器就知道它不会得到返回值,因为肯定会抛出异常
    • -我不喜欢看起来像Handler.handleException(libEx)的行,因为它抛出一堆异常并不完全明显
    • -我们很难使用异常发生位置(即我们无法连接到的URL)的上下文自定义异常消息
  • 返回包含我定义的不同类型异常的枚举的方法。基于枚举,我可以创建要抛出的不同异常。 公共静态异常类型枚举处理程序

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

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

    • -我仍然需要一堆自定义代码来在捕获LibException的每个位置创建异常
  • 与#2类似,但我可以使用多种方法(如isAuthenticationException(libEx)或isConnectionProblem(libEx))代替枚举返回,然后自己相应地抛出异常

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

  • 现在,如果我用这个问题把每个人都弄糊涂了,我想我试图找到一个优雅的解决方案,类似于第页“检查异常不适当地暴露实现细节”一节中描述的问题

    社区是否有其他关于编码方法的建议,以正确、优雅地处理这些异常