我有时会看到
try {
} catch(Throwable e) {
}
Run Code Online (Sandbox Code Playgroud)
而有时
try {
} catch(Exception e) {
}
Run Code Online (Sandbox Code Playgroud)
有什么不同
我们最近遇到了一个Java服务器应用程序的问题,其中应用程序抛出了未捕获的错误,因为Error是Throwable的一个单独的子类,我们只捕获异常.
我们通过捕获Throwables而不是Exceptions解决了当前的问题,但是这让我想到为什么你想要捕获Exceptions而不是Throwables,因为你会错过错误.
所以,当你能捕获Throwables时,你为什么要捕捉异常呢?
在过去,我会用以下方法阅读大量代码:
public Object doSomething() throws Throwable {
...
}
Run Code Online (Sandbox Code Playgroud)
通常的做法是这样做吗?
什么是利弊?
throws Trowable 在我看来,像"特工橙"的方式让异常完成了
编辑
处理方法中的预期异常
抛出意外的异常(逐个)
不关心错误
这是要走的路吗?
Java允许您创建一个全新的子类型Throwable,例如:
public class FlyingPig extends Throwable { ... }
Run Code Online (Sandbox Code Playgroud)
现在,很少,我可以这样做:
throw new FlyingPig("Oink!");
Run Code Online (Sandbox Code Playgroud)
当然还有其他地方:
try { ... } catch (FlyingPig porky) { ... }
Run Code Online (Sandbox Code Playgroud)
我的问题是:
extends Throwable?我真的想做这样的事情的场景具有以下属性:
Error,而且它什么也没Exception发生.
catch等待它.它不会"滑倒"过去.它不会"逃避"任何catch一般Exception和/或任何尝试Error.所以也许我现在很清楚我想说的FlyingPig是:这是一个详尽的递归搜索的结果.
要搜索的对象存在:它只是在大海中找到它的问题,即搜索空间.搜索过程很长,因此相对昂贵的异常处理成本可以忽略不计.事实上,传统的控制流构造使用boolean isFound标志的替代方案可能更昂贵,因为必须在整个搜索过程中连续检查,最有可能在递归的每个级别.此检查将在99.99%的时间内失败,但绝对有必要传播终止条件.在某种程度上,虽然有效,但检查效率低下!
通过简单的 …
我发现Java的反射API是异常冗长的,我经常想要捕获每个特定的异常,但只是抛出异常.这是不好的做法,还是你真的把所有这些例外都抛在了方法签名上?然后,调用该方法的每个方法都必须以某种方式处理每个特定的异常.相反,我正在考虑这样做:
public void someMethod()
throws Exception {
try {
// do a bunch of reflection...
} catch(ClassCastException classCastException) {
throw new Exception("Some specific message.", classCastException);
} catch(InvocationTargetException invocationTargetException) {
throw new Exception("Some specific message.", invocationTargetException);
}
}
Run Code Online (Sandbox Code Playgroud)
这种做法很糟糕吗?
我想知道是否有办法编写一个catch语句,只要在程序中抛出任何异常就会激活它.谢谢!