【发布时间】:2011-08-03 17:21:41
【问题描述】:
我今天早些时候在 stackoverflow 上阅读了a question,它让我思考处理异常的最佳实践是什么。
所以,我的问题是最佳实践来处理异常以生成干净和高质量的代码。
这是我的代码,我认为它很简单,但如果我错了或不清楚,请告诉我! 我试图在方法中牢记可测试性和相同的抽象级别。
欢迎提出任何建设性意见。 :)
import java.awt.Point;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.base.Preconditions;
/**
* <p>This is a dummy code.</p>
* The aim is present the best practice on exception separation and handling.
*/
public class ExceptionHandlingDemo {
// System.out is not a good practice. Using logger is good for testing too (can be checked if the expected error messages are produced).
private Logger logger = LoggerFactory.getLogger(ExceptionHandlingDemo.class);
// instance of cannot work with List<Point>
private interface PointList extends List<Point> {}
/**
* The method that loads a list of points from a file.
* @param path - The path and the name of the file to be loaded.
* Precondition: path cannot be {@code null}. In such case {@link NullPointerException} will be thrown.
* Postcondition: if the file don't exist, some IOException occurs or the file doesn't contain the list the returned object is {@code null}.
* */
/* (Google throws NullpointerExceptio) since it is not forbidden for the developers to throw it. I know this is arguable but this is out of topic for now. */
public List<Point> loadPointList(final String path) {
Preconditions.checkNotNull(path, "The path of the file cannot be null");
List<Point> pointListToReturn = null;
ObjectInputStream in = null;
try {
in = openObjectInputStream(path);
pointListToReturn = readPointList(in);
} catch (final Throwable throwable) {
handleException(throwable);
} finally {
close(in);
}
return pointListToReturn;
}
/*======== Private helper methods by now ========*/
private ObjectInputStream openObjectInputStream(final String filename) throws FileNotFoundException, IOException {
return new ObjectInputStream(new FileInputStream(filename));
}
private List<Point> readPointList(final ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
final Object object = objectInputStream.readObject();
List<Point> ret = null;
if (object instanceof PointList) {
ret = (PointList) object;
}
return ret;
}
private void handleException(final Throwable throwable) {
// I don't know the best practice here ...
logger.error(throwable.toString());
}
private void close(final Closeable closeable) {
if (closeable != null) {
try {
closeable.close();
} catch (IOException e) {
logger.error("Failed closing: %s", closeable);
}
}
}
/*======== Getters and setters by now. ========*/
// ...
/**
* @param args
*/
public static void main(String[] args) {
ExceptionHandlingDemo test = new ExceptionHandlingDemo();
test.loadPointList("test-filename.ext");
}
}
已编辑:
我要避免的是一个接一个地写很多 catch case...
【问题讨论】:
-
@xscape:我一定会读的,谢谢。
-
作为旁注,我建议您标记您的私有帮助方法
static,因为它们就是这样:它们仅根据这些输入获取输入并产生输出。当我在你的方法声明中没有看到static关键字时,我不得不检查这些方法是否真的没有使用任何状态,这很糟糕,因为代码迫使我专注于一些根本不重要的东西来阅读它。这个问题涉及:stackoverflow.com/questions/3346764/… -
@Bruno Reis:谢谢,我会看的。