什么是你应该发生的异常?

时间:2009-07-14 12:44:15

标签: java exception

Java检查的异常有时会强制您捕获您认为永远不会抛出的已检查异常。最佳实践要求您将其包装在未经检查的异常中并重新抛出,以防万一。在这种情况下你用什么例外类进行处理?

你会在“//永远不会发生”的案例中包含什么例外?

9 个答案:

答案 0 :(得分:3)

我还没有,但我会按照以下方式进行:

  • 让它扩展错误而不是Exception / RuntimeException,从那以后它不太可能被错误处理程序捕获,而错误处理程序没有为它做好准备;
  • 将其包装在一些静态实用程序调用中:

示例:

public static void doAssert(boolean result, String reason) {

    if ( !result ) 
        throw new OMGWereDoomedError("Assertion failed: " + reason + " .");
}

我更喜欢这些包装器,因为我可以根据需要更改实现。

另外,我不提倡使用断言,因为我并不总是控制运行时标志,但我确实希望执行在系统受到危害时突然停止。

考虑一下:

  • 向用户显示抱歉,我们无法处理您的付款页面;
  • 即使系统处于不确定状态,也会向用户确认结果。

你会选择哪个?

答案 1 :(得分:2)

例如,我的警告是to-UTF-8字节字符转换

String.getBytes("UTF-8");

需要始终将其包装在try-catch中,因为它是一种通用方法。由于UTF-8可以被视为标准,我希望对字符串进行直接String.getUTF8()调用,类似于GetStringUTF8Bytes JNI方法。

当然它可以用静态的Charset.UTF8常量替换,并使用getBytes()。

对我来说,第二个烦恼是需要将close()包装成try-catch。也许我不是那么有经验,但是当你已经遇到流问题时看不出它有什么帮助,你甚至无法默默地关闭它。你实际上只是记录并忽略异常。

显然,你可以使用抑制器方法调用来做到这一点。

当您使用正则表达式或模式验证检查字符串是有效值时,还有一些简单的值字符串转换。

答案 2 :(得分:2)

我使用AssertionError和字符串这应该永远不会发生

答案 3 :(得分:1)

任何RuntimeException或其后代的类都不需要放在方法的throws子句中。因此,如果您不希望某人必须处理它,因为它不应该发生,那么请使用它。

对于“无法连接到数据库”这样的事情是有意义的,因为如果您的数据库不可用,您的应用程序将无法运行。因此,您抛出一个运行时异常,启动应用程序的人将其视为一个问题。但是你不需要在你的投掷中一直向上声明它。

答案 4 :(得分:1)

ImpossibleHappenedException

答案 5 :(得分:1)

除非代码不正确,否则应该使用断言检查不应发生的条件。这样你就可以在生产版本中禁用它们。

但我不想留下一个简单的assert false;,我也不想写愚蠢的消息,如默认情况下,交换机应该永远不会触发 x应该是非空的,*这应该永远不会发生“。它不应该,但确实如此。无论如何。此外,当你看到一条消息抱怨不应该有的东西时,听起来不是有点抱怨/ em>?我也不想在可执行文件中包含大量这些消息,因为它们通常从不使用,并且每个消息都只与几千个函数中的某个小函数相关。

所以我喜欢

 assert false : "Programming Error"

编程错误正是阻止应用程序工作的原因,因此它非常适合这种情况。

 switch (x)
 {
     case GO_FORWARD:
          ... break
     case BUY_SWORD;
          ... break
     default:
          assert false : "Programming Error"
 }


 /* at this point, we have already had checked that
    we have the money */
 try {
      buy_sword(); buy_elixir();
 } catch (InsufficientFunds) {
      /* if the code was correct, the funds would be sufficient
         so this event means the code is broken. Telling
         the user something like "Funds should be sufficient"
         won't be helpful to the user, so we put in a generic error message */
      throw new AssertionError("Programming Error");
 }

如果您想一直运行这些检查,那么而不是

 assert false : "Programming Error"
 assert expr : "Programming Error"

DO

 if (! expr)
      throw new Exception("Programming Error")

甚至派生ProgrammingError例外类。

答案 6 :(得分:1)

我喜欢“无法访问的代码”

答案 7 :(得分:1)

在编辑问题之前,这更适用于original version of the question,以专门处理捕获已检查的异常。

免责声明:我最初在对该问题的评论中发布了一个片段,因为该问题已在该时间点关闭。

int salary = ...;

if (salary == 0) {
    // ...
} else if (salary < 0) {
    // ...
} else if (salary > 0) {
    // ...
} else {
    throw new IllegalStateException("The fundamental mathematics of the universe have been compromised");
}

答案 8 :(得分:1)

永远不会发生错误而不是异常。异常描述了您可能可以处理的情况。你想怎么处理意外?因为它是一个断言,这个特殊的异常永远不会发生,我会使用AssertionError