我正在设计一个 WinForms 应用程序。
目前,我的所有异常都在 UI 级别记录。
但是,对于他们中的任何一个,我除了记录之外不会做任何事情。这是否表明设计很糟糕?
此外,在一种方法中(.NET 的方法在 Windows 服务上执行命令),它可以抛出 Win32Exception 和 InvalidOperationException 类型的异常。
对于像 FileNotFound 这样的异常,我可以提示用户提供另一个文件(尽管 .NET 有内置方法来检查文件是否存在),但是对于像上面这样的异常,它们都归结为低级问题与机器一起,所以这些只能被真正记录。
这是决定捕获哪些异常的正确方法吗?另外,我应该捕获还是抛出 ArgumentNullException?这表明代码有问题,对吗?
最佳答案
(我将在整个答案中使用 Eric Lippert 的 taxonomy of exceptions。)
如果您对此无能为力,则只需登录并退出当前操作、屏幕或整个应用程序,具体取决于错误的严重程度。只是不要尝试在遇到致命异常时继续操作。在某些极端情况下(例如AccessViolationException
),仅记录甚至让finally block 运行可能不是一个好主意,因为您不知道如果在损坏的进程中运行代码会发生什么。
FileNotFoundException
和其他您无论如何都应该处理的外源异常。尽管您可以事先检查文件是否存在,但没有什么可以阻止它在检查和使用之间变得不可访问。这些异常取决于您无法控制的外部条件,因此您应该做好处理它们的准备。
您永远不应该捕获ArgumentNullException
或任何其他愚蠢的异常。 如果这样做会让你感到痛苦,那就不要这样做。如果你在不应该传递的时候传递了一个空参数,那么就不要传递它。修复代码,以便它预先处理空引用。
关于exception - 我应该处理哪些异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5564325/