可能重复:
Throws or try-catch
我正在编写API,我希望编写代码,以便在特定场景中引发异常。我创建了一个异常类,如下所示: -
public class InvalidSeverityException extends Exception {
private static final long serialVersionUID = 1L;
public InvalidSeverityException() {
// TODO Auto-generated constructor stub
}
}
在代码库中我有以下内容来调用代码: -
throw new InvalidSeverityException();
然而,Eclipse建议我使用throws
或将其括在try ... catch
块中。我觉得我不应该抓住这个错误,并且使用我的API的开发人员应该将代码包含在try...catch
中。
这有意义吗?我做错了吗?
答案 0 :(得分:4)
在Java中处理异常时,您必须了解已检查异常和未经检查的异常的概念。
在你的情况下,你现在正在定义一个已检查的异常,也许你想要一个未经检查的异常。
以下是每种类型的简要说明:
此异常必须是引发它们的方法签名的一部分(或者调用一个方法),或者必须使用try catch
块捕获它们并处理问题。通常在有关错误的事情时以及当您希望开发人员意识到可能发生此类错误并且必须处理时,使用已检查的异常。
在java中java.lang.Exception
是一个已检查的异常,并且还将检查其所有子类。
另一方面,此异常不需要创建方法签名的一部分,也不必包装在try catch
块中抛出new的方法。只是期望调用堆栈中的某个位置会有try catch
来处理它,否则如果它到达JVM,它将很好地转储堆栈跟踪。
在java java.lang.RuntimeException
中是一个未经检查的异常,它的所有子类都是如此。
我的意见
如果您要定义API我的建议是使用已检查的异常,这主要是因为您明确告知使用您的API的开发人员可能会发生此类异常(因此无论如何他们都可以处理它)要)。
答案 1 :(得分:1)
您拥有throw new InvalidSeverityException();
的方法应定义抛出InvalidSeverityException
示例:
void yourMethod() throws InvalidSeverityException
{
........//Some code
throw new InvalidSeverityException();
}
答案 2 :(得分:1)
你是对的,你不应该抓住它。正如eclipse所建议的那样,你应该使用throws
,这样开发人员就会知道你的方法可能会引发异常,然后可以捕获它。
.... method() throws YourException{
答案 3 :(得分:1)
那么你肯定遵循Eclipse的第一个建议并设置你的方法来抛出异常。
public void myMethod() throws InvalidSeverityException {
//throw it somewhere in here so that other
//developer can catch it while calling your method
}