因此,我的自定义异常是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的关键思想是您始终知道可能发生的所有可能的Exception。这就是Java强制您将所有可能抛出的Exception(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调用不同的构造函数,因此可以不同地处理不同的Exception。最后一个catch
包含意外的异常,因为您的程序遇到了RuntimeException
您未计划的异常(可能是)。如果用户随后抱怨UnexpectedPatternFormatException
,则可以返回到代码并对其进行修复,以使基础Exception不再被抛出或以更有意义的方式被包装。您也可以只使用一个UnexpectedMySomethingException
类作为所有try / catch块的后备对象,以使事情简单一些。
关于由异常引起的问题,应该说最后一句话:即使Java在各种情况下都使用了异常,即使那些在很大程度上不受Java程序员控制的情况(例如,在访问文件或试图将字符串解析为数字时) ),请始终注意,抛出和捕获异常实际上是非常昂贵的,这就是为什么许多人倾向于避免这种情况的原因。如果性能不是问题(当异常是罕见事件时),则仅真正使用异常。
另外,如果抛出异常并为时太晚,异常可能会威胁程序状态的完整性,从而使原本应该执行的行无法执行(例如,用于清理资源的代码或其他需要保留代码的代码)。程序状态为“正确”),因此,唯一安全的做法是关闭程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句