Java 以集中的方式转换从外部库引发的异常
我想问一个关于Java异常的代码风格问题。我正在使用Java调用一个使用JNI的C/C++库。我使用的库中的约定是,我可以调用的大多数方法都会对所有错误抛出相同的异常类型。我们称之为LibException。现在,LibException实际上是一个包装器异常,可以出现许多错误,包括身份验证问题、连接问题或更严重的问题,如输入损坏等。LibException还包含错误代码int以及错误描述字符串 更让人困惑的是,如果我在回调中将LibException抛出到库中,LibException还可以包装我自己的一个异常!我的意思是,我有时提供一个回调方法,它由库调用,有时我不得不在回调中抛出一个异常。在这种情况下,库将拾取异常,将其包装在LibException中,并在原始方法调用中将其抛出给我 我希望每个潜在问题都能得到不同的处理。需要向用户显示身份验证问题,以便用户可以重试,应通知用户连接问题,但更严重的问题可能必须触发我的诊断报告系统(一种自动机制,可将部分日志文件发送给我进行调试)当然,我在回调中向库抛出的任何异常都需要作为原始异常类型重新抛出 因为我在多个位置调用不同的方法,所以我认为在LibExceptions的异常处理周围放置一些结构是一个好主意。这是为了避免代码重复,但最重要的是确保正确处理不同的异常类型,并且future me不会忘记通知用户身份验证失败 我尝试了很多方法,但是我对我得到的代码结构不太满意,所以我想从社区获得一些关于最佳实践的想法Java 以集中的方式转换从外部库引发的异常,java,exception-handling,Java,Exception Handling,我想问一个关于Java异常的代码风格问题。我正在使用Java调用一个使用JNI的C/C++库。我使用的库中的约定是,我可以调用的大多数方法都会对所有错误抛出相同的异常类型。我们称之为LibException。现在,LibException实际上是一个包装器异常,可以出现许多错误,包括身份验证问题、连接问题或更严重的问题,如输入损坏等。LibException还包含错误代码int以及错误描述字符串 更让人困惑的是,如果我在回调中将LibException抛出到库中,LibException还可以包
- +这项工作很好,因为它强制处理所有抛出的异常李>
- +ve如果添加了新的异常类型,编译器将强制我处理新的异常
- -ve即使handleException()是一个总是抛出异常的方法,编译器(正确地)也不知道这一点。这意味着,如果我们在必须返回某些内容的方法中使用handleException(),编译器会抱怨缺少返回类型。为了让编译器满意,我必须在调用handleException()之后立即抛出另一个异常,这样编译器就知道它不会得到返回值,因为肯定会抛出异常李>
- -我不喜欢看起来像Handler.handleException(libEx)的行,因为它抛出一堆异常并不完全明显
- -我们很难使用异常发生位置(即我们无法连接到的URL)的上下文自定义异常消息
- +ve自从创建了异常之后,我现在可以使用额外的上下文自定义一些错误消息
- -ve我仍然可能忘记处理枚举(特别是如果我将来创建一个新类别)
- -我仍然需要一堆自定义代码来在捕获LibException的每个位置创建异常
- -我肯定会忘记正确处理所有部分,尤其是如果以后添加了新的异常类型