这取决于你的逻辑是如何设置的。如果您的文件读取逻辑是泛型的(不是 C# 泛型,在某种意义上它不是特定的泛型),最好将异常放在抛出更高一点的位置。
例如,如果这是设置方式:
// just an example
FileContents ReadFile(string path)
{
// Don't necessarily throw exceptions related to data validity
}
SomeObject FromFile(string path)
{
FileContents contents = ReadFile(path);
// Do throw exceptions related to data validity
// construct your object
}
这一切都归结为在哪里进行验证是有意义的。作为一般规则,您应该只在特殊情况下抛出异常(在特定级别无法恢复的情况)。调用堆栈中较高的某些方法可能知道在这种情况下该做什么。
此外,如果您必须抛出许多不同类型的异常,出于对方法调用者(间接或直接,您或其他开发人员)的礼貌,最好让您的异常具有共同的基本异常(其他比System.Exception
),所以可以用尽可能少的catch
语句来捕获。
一个示例继承层次结构可能是:
- 系统异常
- 数据加载异常
- 名称异常
- NameTooLongException
- 无效名称异常
- 年龄异常
- ...
这样,如果调用者只想知道方法是否成功,他们只需要捕获DataLoadException
,而不是捕获每种类型的可抛出异常。如果调用者想知道到底出了什么问题,他们也可以这样做。