Java中的异常和错误代码

Java中的异常和错误代码,java,Java,我有一个关于java中错误处理的问题。假设一个库有几个错误代码。对于各种错误,有一个单独的异常,并在其中包含一个错误代码枚举,这是一种好的做法吗 更新:在异常中包含错误代码是一种好的做法吗?不太好。您应该使用不同的异常类型,每种错误类型对应一种(在合理的范围内,不要创建数百种不同的异常类型!) 它允许您只捕获真正想要捕获的对象,而不是处理每个异常以发现发生了什么 但是,可以自定义异常消息,以澄清同一类型的多个异常中的错误源 这一点很清楚。当前的实践至少有一个基类(IOException)和子类,

我有一个关于java中错误处理的问题。假设一个库有几个错误代码。对于各种错误,有一个单独的异常,并在其中包含一个错误代码枚举,这是一种好的做法吗


更新:在异常中包含错误代码是一种好的做法吗?

不太好。您应该使用不同的异常类型,每种错误类型对应一种(在合理的范围内,不要创建数百种不同的异常类型!)

它允许您只捕获真正想要捕获的对象,而不是处理每个异常以发现发生了什么

但是,可以自定义异常消息,以澄清同一类型的多个异常中的错误源


这一点很清楚。

当前的实践至少有一个基类(IOException)和子类,如FileNotFoundException、UnsupportedEncodingException。在使用方面,可以使用IOException捕获所有内容

这允许只处理FileNotFound

另一方面,由于有许多代码,比如HTTP响应代码,您只需要一个异常的方法是完全合理的。

错误和错误代码是两个独立的东西。一个定义发生了什么,另一个标识错误的特定来源

最好的例子是与数据库相关的异常,其中SQL异常包括一个定义导致它的错误的代码

通过枚举或字段访问代码是一项设计决策。如果要抛出一个异常,并向其添加错误代码,则可以将其视为两步异常处理:

  • 捕获确定错误上下文的异常
    • 保安
    • 数据库
    • 加工
    • 解析
    • 无效操作
  • 检查异常代码以确定源
    • 用户没有足够的权限执行他尝试执行的操作
    • 数据库连接错误
    • 查询相关问题
    • 系统当前过载
    • 找不到特定操作的管理器

  • 一旦确定了源代码并了解了其上下文(异常),就可以相应地采取行动。依我看,层次结构是一种很好的方法,可以在需要时用代码进行扩展。请记住,如果为了表示源而将异常子类化10次,会对可维护性和复杂性产生影响。

    如果错误代码太多,并且您不希望用户捕获和恢复,则可以使用一种嵌入整数错误代码的异常类型。如果在编译时无法确定错误代码集,则您实际上没有选择余地。

    将每个错误设置为自己的类型,捕获错误后,您必须使用enum方法确定错误的类型。我个人会选择带有公共超类的异常类型层次结构,因此,如果您想要捕获特定的对象,或者使用单个
    捕获(ParentException e)
    捕获所有对象,那么您可以捕获特定的对象,但问题是,假设方法a调用方法B来获取一些值。B中发生了一些错误。因此标记该错误的最佳方法是B抛出异常。但是A需要向其调用者返回错误代码。如何处理这种情况?您只需在中捕获异常,并给定其上下文,将相关错误代码返回给调用者。@prashanthkvs正是X.L.Ant所说的。异常处理的另一个重要部分是对其传播的管理。如果异常被检查并被B抛出,则A将被强制捕获或抛出它。如果异常是未检查的,你必须非常谨慎。@Gamb那么,将相应的错误代码存储在异常中是否是一种好的做法?@prashanthkvs好的做法和坏的做法都是主观的。我想说,就可维护性和复杂性而言,大规模异常子类化是一种糟糕的做法,但除非必要,否则我不会使用错误代码。