从概念上讲,我一直在决定我的项目的异常处理结构.
假设你有一个例子:
public abstract class Data {
public abstract String read();
}
Run Code Online (Sandbox Code Playgroud)
还有两个子类FileData,它从一些指定的文件读取你的数据,而StaticData,它只返回一些预定义的常量数据.
现在,在读取文件时,可能会在FileData中抛出IOException,但StaticData将永远不会抛出.大多数样式指南建议将Exception传播到调用堆栈,直到有足够的上下文可用于有效处理它.
但我真的不想在抽象的read()方法中添加throws子句.为什么?因为Data和使用它的复杂机器对文件一无所知,所以它只知道数据.此外,可能还有其他数据子类(以及更多这些子类)从不抛出异常并完美地传递数据.
另一方面,IOException是必要的,因为如果磁盘不可读(或某些此类),则必须抛出错误.所以我看到的唯一出路就是捕获IOException并在其位置抛出一些RuntimeException.
这是正确的哲学吗?
这是我看到的常见模式,其中与异常关联的错误代码存储为静态最终整数.当创建要抛出的异常时,它将使用这些代码之一以及错误消息构造.这导致该方法要抓住它必须查看代码然后决定一个行动方案.
替代似乎是 - 为每个异常错误情况声明一个类(尽管相关的异常将从一个公共基类中解除)
有中间地带吗?推荐的方法是什么?
我对Java很新,而且我试图了解异常以及什么时候应该使用它们.我一直在使用它们作为错误检查的一种形式,但我遇到过几个人说异常应该仅用于程序控制之外的事情,例如用户错误.
我有一个函数,对于2维的给定行,计算xMin和xMax之间的所有y值.如果直线是垂直的,则此函数会抛出异常,因为无法计算垂直线上y的所有值.在两个y值之间存在等效函数查找点,如果该行是水平的,则会引发错误.
findPointsInRangeOfX (int xMin, int xMax) throws LineIsVerticalException {
// check if line is vertical
// if vertical, throw an exception
// else calculate the y values for each integer between xMin and xMax
// return y values
}
Run Code Online (Sandbox Code Playgroud)
我将此函数称为查找给定窗口中某一行上所有点的一部分,由最小和最大x和y值给出.我不检查此功能中的线是否垂直; 相反,我依靠findPointsInRangeOfX中的检查并在方法周围使用try和catch块.
pointsInWindow (int xMin, int xMax, int yMin, int yMax) {
try {
// Find list of all the points between xMin and xMax.
// Remove from list all points not between yMin and yMax
}
catch (LineIsVerticalException e) …Run Code Online (Sandbox Code Playgroud)