如何用另一个替换基本异常?

时间:2014-11-18 12:53:37

标签: java exception

我有以下代码

try {
    ....
} catch (Exception e) {
    log.error(String.format(SOME_CUSTOM_VARIABLE, e);
    throw e;
}

我希望异常获取字符串SOME_CUSTOM_STRING_WITH_VARIABLES。
所以我想做的是

try {
    ....
} catch (Exception e) {
    log.error(String.format(SOME_CUSTOM_VARIABLE, e);
    throw new Exception(SOME_CUSTOM_VARIABLE, e);
}

但这迫使我添加"抛出异常"方法签名。
无论如何,这种方法引发了异常。为什么我要更改签名?

如何将基本例外替换为另一个例外?

5 个答案:

答案 0 :(得分:0)

因为抛出异常意味着创建自己的Exception方法throws所以你需要声明方法throws,以便方法的用户知道catch它。就像你必须首先包围它在尝试捕获中的任何东西一样。 如果没有强制执行,则声明您的方法throws然后Exception可能会丢失。

答案 1 :(得分:0)

在Java中你有checked exceptions - 这些必须通过throw方法声明 - 并且未经检查,这些不必是。 (然后有Error个,但是现在让我们把它们放在一边。)

没有详细介绍要使用的异常策略,基本上你可以抛出任何异常,或者从RuntimeException扩展而不必在你的方法上声明它。例如。你可以

void myMethod() { // no 'throws' declaration
    try {
        ...
    } catch (Exception e) {
        throw new RuntimeException( SOME_CUSTOM_VARIABLE , e );
    }
}

我会建议this SO threadthis blog post就该主题进行讨论。

关于在throws子句中用另一个替换异常的问题:我知道你的方法已经抛出了一些不是特别java.lang.Exception的异常。在这种情况下,你大部分都不走运 - 你只能用相同的或子类化的“替换”抛出的异常,否则你将不得不编辑/添加throws子句。

干杯,

答案 2 :(得分:0)

如果您不想更改方法签名,则可以创建自定义RuntimeException并将其丢弃。

但要注意后果:

  • 如果此自定义RuntimeException在上层课程中没有正确捕获,则可能导致整个程序崩溃。
  • 它更像是一种解决方法,当抛出RuntimeException时,程序不应该从异常中恢复。运行时异常表示编程问题导致的问题。

有关此内容的一些信息:https://docs.oracle.com/javase/tutorial/essential/exceptions/runtime.html

答案 3 :(得分:0)

  

但这迫使我添加"抛出异常"方法签名。无论如何,这种方法都引发了一个例外。为什么我要更改签名?

这取决于,如果您正在抛出checked exception,那么java编译器将强制您处理它,即您需要将其包含在方法签名中或在方法体中处理它。
但是如果你抛出unchecked exception而不需要修改方法签名

答案 4 :(得分:0)

我强烈建议您不要通过抛出RuntimeException来解决此问题。 这些只是JVM的保留,使用一个只是为了避免声明一个throw子句将是一种可怕的风格。

Java异常的名称和目的是(恕我直言)混淆。 你应该坚持认为从Exception子类化的东西需要处理程序和从Error派生的东西不需要。忽略规则破坏者RuntimeException并向你的伙伴们抱怨,并在stackoverflow.com上随机告诉他们它应该被称为RuntimeError和子类Error(对于f ** ks缘故)。

如果你确实有一个条件,其中一个方法有一个throws子句声明Exception,但你有充分的理由现在抛出它,那么我建议你将Error子类化为{{1} }或UnexpectedExceptionError

如果UnhandledExceptionError'不可能,请使用第一个 - 例如您知道的抽象I / O方法由(例如)内存中的字符串支持并且不能真正抛出{{ 1}}尽管有接口声明。

如果抛出Exception会破坏您正在实施的某种方法的签名/覆盖无法修改以宣传潜在的IOException

作为第三种方式,将异常传播到Exception的{​​{1}}方法是很自然的。 在这些情况下,我建议将Exception传递给某个监督程序,作为一种遗书,因为无论如何你从run()抛出的东西都会被忽略,你可能想要做一些事情来识别{的完全失败{1}}!

PS:如果你这样做是因为你很懒,并且不想正确处理异常,你可能会被诅咒维护由同样态度的人编写的代码:)< / p>