在某个在线论坛上,有人提到Java的静态异常检查功能并不好,并且会导致可伸缩性和版本控制问题。什么是静态异常检查和动态异常检查?
我想在类函数中抛出一个新的异常,打破客户端代码可以归因于版本问题。但我不确定。
什么是静态异常检查的可扩展性问题?
什么是动态异常检查?
在某个在线论坛上,有人提到Java的静态异常检查功能并不好,并且会导致可伸缩性和版本控制问题。什么是静态异常检查和动态异常检查?
我想在类函数中抛出一个新的异常,打破客户端代码可以归因于版本问题。但我不确定。
什么是静态异常检查的可扩展性问题?
什么是动态异常检查?
当程序员无法抛出适合该方法的异常时,检查Java中的异常会导致可伸缩性问题。 (请参阅有效Java,条目43:抛出适用于抽象的异常)。
懒惰的程序员倾向于在其方法的throws
子句中添加例外情况,而不考虑它们是否合适。因此,随着您在应用程序体系结构中越来越高,方法会聚集越来越多的异常。如果人们不小心,顶级方法会抛出10个或更多的异常。例如,在设计用于加密数据的方法中,可能抛出许多低级别的例外(例如,IOException
,NoSuchAlgorithmException
,KeyNotFoundException
...)。没有必要将这些公开给API用户。相反,可能会抛出一个异常,并将异常细节存储在cause
字段中。
我相信“动态异常检查”可能是指捕捉Throwable
或Exception
(根类之一)和动态决定是否处理异常,一些外部的刺激。例如:
List<Class<?>> exceptionTypes = new ArrayList<>();
exceptionTypes.add(IllegalArgumentException.class);
exceptionTypes.add(IOException.class);
try {
// do something
} catch (Exception e) {
if (exceptionTypes.contains(e.getClass())) {
e.printStackTrace();
}
}
注意:上面的例子只是一个例子。但想象一下代表用户执行代码的IDE,并允许他们选择他们希望捕获的异常类。
我想动态异常检查只是在运行时触发异常的另一个名称。
虽然我相信静态异常检查,但静态异常检查的Java方法确实存在与接口实现有关的问题。
说,我们有IParser
。其方法parse()
可能抛出什么适当的例外?可能SyntaxErrorException
。现在,我们希望有一个ServerResponseParserFromURL
以这样的方式被使用:
class ServerResponseParserFromURL implements IParser { .... };
....
try {
IParser parser = new ServerResponseParser(new URL("http://example.com/test.htm"));
parser.parse();
....
}
这是问题—的IParser
的实施可能会闪光,比如,NoRouteToHostException
。因此,我们不能用漂亮,简洁的形式,需要退回到长型:
class ServerResponseParser implements IParser { .... };
....
try {
String response = getServerResponse(new URL("http://example.com/test.htm"));
IParser parser = new ServerResponseParser(response);
parser.parse();
....
}
正如你看到的,在实践中,我们IParser
是IStringParser
,而不是通用IParser
。
虽然在这种特殊情况下它可能是可以容忍的,但当我们想要提供IParser
作为函数f
的参数之一时,它会变得复杂。说,为了能够解析URL识别的服务器的响应,我们不能仅仅馈送ServerResponseParser
对象和url —,我们需要找到一种将getServerResponse
方法提供给f
的方法。
你的意思是选中和未选中异常处理? – 2013-02-24 07:09:22
据推测http://en.wikipedia.org/wiki/Exception_handling#Dynamic_checking_of_exceptions – 2013-02-24 07:10:28
@ Quoi:我不知道,因为我不知道如果动态异常检查与未经检查的异常处理相同。 – 2013-02-24 07:36:29