我认为,IOException异常和FileNotFoundException异常正是这类例外
都能跟得上的,这些其实都是“其他”类型的异常,超越你的编程技能的那种。不管你编程多好,编译器和库都会让你“意识到”会发生什么。
想想这样的场景:
您创建的数据保存到临时文件夹的应用程序。
一切正常,你已经检查了文件夹存在,如果没有,你创建你的自我。
然后你写2 MB到临时文件夹。
突然,其他的系统进程,删除临时文件夹,你不能写下去了。
没有什么可以做的,以防止这种编程方式,在一些系统中可能会发生操作(在unix中,root用户可能会执行rm -rf/tmp,并且你无能为力。系统不会让其他进程删除正在使用的文件)
通过强制您检查代码中的这类异常,平台设计人员认为至少您意识到了这一点。
Jon is correct有时没有什么可以做这件事,大概采伐程序死掉之前,被认为是“处理异常”(手柄差肯定的,但至少处理)
try {
....
} catch(IOException ioe) {
logger.severe(
String.format("Got ioe while writting file %s. Data was acquired using id = %d, the message is: %s",
fileName,
idWhereDataCame,
ioe.getMessage()));
throw ioe;
}
另一件事你可以做的就是“链接”异常以适应抽象。
也许你的应用程序有一个GUI,向用户显示IOException并不意味着什么,或可能是一个security vulnerability。可以发送修改的消息。
try {
....
} catch(IOException ioe) {
throw new EndUserException("The operation you've requeste could not be completed, please contact your administrator" , ioe);
}
而且EndUserException可能某处GUI的对话消息被捕获并呈现给用户(而不是刚刚消失在他眼中的应用,而无需进一步的信息)。当然,你不能做任何事情来恢复这个IOException,但至少你死于风格:P
最后一个客户端代码,可以使用不同的实现,并不是所有的异常都是合理的。
例如,再次考虑第一种情况。同一个“操作”可以有三种“插件”服务来执行数据保存。
a) Write the data to a file.
b) Or, write to a db
c) Or write to a remote server.
接口不应该抛出:
java.io.IOException
java.sql.SQLException
也不
java.net.UnknownHostException
但不是像
my.application.DataNotSavedException
和不同的实现会在正确处理异常水平,和其转换为相应的抽象:
客户端代码:
DataSaver saver = DataServer.getSaverFor("someKeyIdString");
try {
saver.save(myData);
} catch(DataNotSavedException dnse) {
// Oh well... .
ShowEndUserError("Data could not be saved due to : " dnse.getMessage());
}
实现代码:
class ServerSaver implements DataSaver {
....
public void save(Data data) throws DataNotSavedException {
// Connect the remore server.
try {
Socket socket = new Socket(this.remoteServer, this.remotePort);
OuputStream out = socket.getOut....
....
....
} catch (UnknownHostException uhe) {
// Oops....
throw new DataNotSavedException(uhe);
}
}
}
FileSaver和DatabaseSaver会做同样的事情。
所有这些都是检查异常因为编译器让你检查它们。
当使用一个或另一个(选中/取消):here
还有其他两种:here
最后运行时的一个更简单的解释是:here
非常好点,漂亮的答案。 – hotshot309 2012-12-21 14:26:21