我有以下代码
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);
}
但这迫使我添加"抛出异常"方法签名。
无论如何,这种方法引发了异常。为什么我要更改签名?
如何将基本例外替换为另一个例外?
答案 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 thread和this 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>