我应该在我的方法中抛出异常吗?

Should I throw an exception in my method?

我正在编写一个程序来将 BibTeX 文件处理为 HTML 代码。该程序允许用户选择将处理哪些字段或如何格式化输出 HTML 代码。

BibTeX 文件是文本数据库。我的程序读取 BibTeX 文件并写入方便的对象格式,并使用此对象生成 HTML。如果有任何语法错误,我的程序会捕获它。

我的问题是:我是否应该编写一个异常(继承自 System.AplicationException),将其抛出,然后将其捕获到 "ErrorLog",这将对用户可见?

或者我应该毫无例外地写 "ErrorLog" - 只在我自己的非标准错误对象上? 哪种解决方案更优雅并且符合 C# 编程中的良好实践?

这取决于异常类型和上下文。作为一般规则(它当然有它的"exceptions"),如果情况特殊并且您无法提前保护自己免受它的影响,您应该使用try-catch来处理它。

如果你正在通过网络读取一个文件,而在这个过程中网络出现故障,你会得到一个异常,没关系,你捕获它,通知用户并做出决定重试、重新开始或停止。每次读取一个字节都检查网络是否正常工作是没有意义的。

另一方面,您不应使用异常来处理应用程序的流程。如果要读取文件,可以先检查文件是否存在,然后再开始读取。您可以尝试阅读它并捕获和异常,但它不是那么干净。另外,请注意创建异常是有成本的,因为您需要创建一个具有许多很多属性(如堆栈跟踪)的大对象。

在我看来,解析语法错误并不是例外情况,您可以找到它,如果需要,记录它,并向用户显示一条消息,说明发生了什么。解析表达式的方法应该 return 一个 Result 对象,指示是否有错误,如果有,错误列表。

阅读 Microsoft 的这篇文章:Best Practices for Exceptions