所以我的自定义异常是PatternFormatException
,并且我已经附加throws PatternFormatException
到我的方法的末尾,但我想知道我如何能够实际获得物理抛出它的方法?我用if statements
吗?即
if //[doesn't_parse] throw PatternFormatException
对于许多不同的代码行来说,这似乎很麻烦?我可以捕获一个更普遍的构建异常,即NumberFormatException
,然后在处理这个,抛出我自己的异常?
您使用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
es调用不同的构造函数,因此可以不同地处理不同的异常.最后一个catch
包装了一个意外的异常,因为你的程序遇到了RuntimeException
你没有计划的异常(可能是a ).如果用户然后抱怨UnexpectedPatternFormatException
,你可以回到你的代码并修复代码,这样底层的Exception就不会再被抛出或者以更有意义的方式被包装.您也可以使用单个UnexpectedMySomethingException
类作为所有try/catch块的后备,以使事情变得更简单.
关于异常引起的问题应该说的最后一句话:尽管Java使用Exceptions来处理各种情况,甚至是那些基本上不受Java程序员控制的情况(例如,当访问文件甚至尝试将字符串解析为数字时) ),始终要知道抛出和捕获异常实际上是非常昂贵的,这就是为什么许多人倾向于避免这种情况.如果性能不是问题(当Exception是罕见的事件时),那么才真正使用Exceptions.
此外,如果抛出异常并且捕获它太晚,异常可能会威胁程序状态的完整性,因此应该执行的行不会被执行(例如,用于清理资源的代码或其他代码需要保留程序状态"正确"),因此,唯一安全的做法是关闭程序.