我的代码中出现了“Throwing warnings”。

8
我正在编写一个处理文件的工具。这个工具将拥有一个命令行界面,但也可以作为第三方代码的类库使用。为了处理错误,我会抛出一个异常。第三方代码可以处理异常,而命令行界面可能只是打印错误并退出。然而,除了致命错误之外,还有可能发生一种不致命的情况,进程可以继续进行,我希望能够“发出警告”并继续进行。
如何处理警告,以使第三方代码和命令行界面都可以对其进行处理?

令人沮丧的是,C#/.NET 没有像其他语言一样提供常规的警告系统。在 Python 中,我可以使用 warnings.warn('some message')logging.warning('some message') 来发出警告,并且知道我的消息很可能对调用代码可见,它的作者可以全局地配置如何处理和记录警告。在 C# 中,没有类似的系统。你不知道调用应用程序是否使用了哪个日志库,而且即使你知道也可能无法连接到它。还有什么办法吗?只能 打印 警告并希望它不会破坏任何东西吗? - Mark Amery
2个回答

5
我建议您不要抛出异常,如果可能的话应该避免使用它们(它们会消耗资源)。相反,您可以创建一个事件并引发它。第三方代码和命令行界面只需要对此事件进行签名即可。

4
好建议。如果你认为“堆栈跟踪对于这个警告很有用”,那么只需使用异常。异常系统本质上是一个高度检测的、昂贵的事件系统。如果警告很少见(并且错误是可恢复的!),可能会使用自定义“异常”。此外,不要扩展“WarningException”,因为它继承了“SystemException”,而这是约定保留的。 - kdbanman

3

如果错误条件确实是异常情况(这通常是罕见的),你也可以抛出异常。

异常并不总是致命的 - 你需要抛出一个特定的异常类型,让第三方代码和命令行代码能够捕获并采取行动。

异常处理的一个原则是处理你知道如何处理的异常 - 如果你为错误定义了一个特定的异常类型,并进行了文档化,客户端代码应该知道如何处理它(或者不处理)。


如果你想通过代码向用户提供已在库中处理但用户可能想知道的警告信息,你可以使用tracing子系统输出跟踪。所有用户只需要配置一个监听器就能在运行时获取信息。

1
我认为警告通常意味着应该返回正常结果,但同时也应该附加一个警告。但是如果使用异常,就不能同时返回值。 - svick
2
@svick - 当然可以 - 通过自定义异常类,您可以添加任何其他属性。而 Exception 本身就有一个 Data KVP 属性来实现这一点。 - Oded
@Oded 抱歉,我误解了您的评论。 - Minh Tran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接