所以我的自定义异常是PatternFormatException
,并且我已经将throws PatternFormatException
附加到我的方法的末尾,但是我想知道我是如何实际获得物理抛出它的方法的?我使用if statements
吗?即
if //[doesn't_parse] throw PatternFormatException
对于许多不同的代码行来说,这似乎很麻烦?我可以捕获一个更普遍的构建异常,即NumberFormatException
,然后在处理这个异常时,抛出我自己的异常吗?
答案 0 :(得分:5)
使用throw
关键字抛出异常:
throw new PatternFormatException(...);
通常,您希望尽早捕获异常并正确处理它们。如果您希望您的解析器(或您正在编写的任何程序)生成有意义的错误,通常最好包装任何捕获的异常并重新抛出它,嵌入更有意义的异常中,让用户更好地了解事物的方式出了问题。
这样的事情:
try {
doSomething(); // throws SomeException
doSomethingElse(); // throws SomeOtherException
}
catch (Exception e) {
throw new PatternFormatException(..., e);
}
如果您确切知道可能发生的异常以及PatternFormatException
是否正确封装了所有异常,那么通常很好。但是,Java中的Exceptions的关键思想是,您始终了解可能发生的所有可能的异常。这就是为什么Java会强制您将所有可能抛出的异常(RuntimeException除外)添加到方法声明中。
更安全的设计是:
try {
doSomething(); // throws SomeException
doSomethingElse(); // throws SomeOtherException
}
catch (SomeException e) {
throw new PatternFormatException(..., e);
}
catch (SomeOtherException e2) {
throw new PatternFormatException(..., e2);
}
catch (Exception e3) {
throw new UnexpectedPatternFormatException(..., e3);
}
请注意,前两个catch
调用不同的构造函数,因此可以不同地处理不同的异常。最后一个catch
包装了一个意外的异常,因为您的程序遇到了一个您没有计划的异常(可能是RuntimeException
)。如果用户然后抱怨UnexpectedPatternFormatException
,您可以回到代码并修复代码,以便不再抛出基础异常或以更有意义的方式包装。您也可以使用单个UnexpectedMySomethingException
类作为所有try / catch块的后备,以使事情变得更简单。
关于异常引起的问题应该说的最后一句话:尽管Java使用Exceptions来处理各种情况,甚至是那些基本上不受Java程序员控制的情况(例如访问文件甚至尝试解析时)字符串作为数字),始终要注意抛出和捕获异常实际上是非常昂贵的,这就是为什么许多人倾向于避免这种情况。如果性能不是问题(当异常是罕见的事件时),那么才真正使用例外。
此外,如果抛出异常并捕获它太晚,异常可能会威胁程序状态的完整性,因此应该执行的行不会被执行(例如清理资源的代码或其他需要的代码保持程序状态“正确”),因此,唯一安全的做法是关闭程序。
答案 1 :(得分:3)
如果我理解你的问题,你可以这样做:
If(somethingBad){
throw new PatternFormatException();
}
如下面的回复中所述。如果你要一遍又一遍地检查这个异常,你可能需要一些静态方法/类方法(使用你的编程大脑)。例如,您可以执行以下操作:
void checkForException(String pattern, String check){
If(!check.equals(pattern)){
throw new PatternFormatException();
}
}
现在你所要做的就是:
try{
checkForException("abc","123");
}catch(PatternFormatException pfe){
System.out.println(pfe); //Whatever you want to happen if the exception is thrown
}
请记住,只能在异常情况下使用例外......
阅读for more information on exceptions。我发现我旁边从不使用例外。