c# - 处理异常时 .Net 中的常见编程错误?

标签 c# .net vb.net exception-handling

<分区>

您在处理异常时遇到过哪些最常见的错误?

似乎异常处理可能是学习如何在 .Net 中“正确”做事的最难的事情之一。特别是考虑到目前排名第一的答案 Common programming mistakes for .NET developers to avoid?与异常处理有关。

希望通过列出一些最常见的错误,我们都能学会更好地处理异常。

最佳答案

What are some of the most common mistakes you've seen made when handling exceptions?

我能想到很多。

首先阅读我关于将异常分类为烦人愚蠢致命外生的文章:

http://ericlippert.com/2008/09/10/vexing-exceptions/

一些常见错误:

  • 无法处理外来异常。
  • 无法处理令人烦恼的异常。
  • 构造抛出令人烦恼的异常的方法。
  • 处理您实际上无法处理的异常,例如致命异常。
  • 处理隐藏代码错误的异常;不要处理愚蠢的异常,修复 bug,这样它就不会在第一时间抛出

  • 安全错误:进入不安全模式失败

    try
    {
      result = CheckPassword();
      if (result == BadPassword) throw BadPasswordException();
    }
    catch(BadPasswordException ex) { ReportError(ex); return; }
    catch(Exception ex) { LogException(ex); }
    AccessUserData();
    

    看看发生了什么?我们未能进入不安全模式。如果 CheckPassword 抛出 NetworkDriverIsAllMessedUpException,那么我们会捕获它、记录它并访问用户数据,而不管密码是否正确。安全模式失败;当你遇到任何异常时,做最坏的打算。

  • 安全错误:产生直接或间接泄露敏感信息的异常。

    这不完全是关于处理代码中的异常,而是关于产生由恶意代码处理的异常。

    有趣的故事。在 .NET 1.0 交付给客户之前,我们发现了一个错误,在该错误中可能会调用引发异常的方法“调用此方法的程序集无权确定文件 C:\foo.txt 的名称”。伟大的。谢谢你让我知道。是什么阻止所述程序集捕获异常并询问其消息以获取文件名?没有什么。我们在发货前修复了它。

    这是一个直接的问题。间接问题是我在 LoadPicture 中用 VBScript 实现的问题。它给出了不同的错误消息,具体取决于不正确的参数是目录、不是图片的文件还是不存在的文件。这意味着您可以将它用作非常慢的磁盘浏览器!通过尝试一大堆不同的事情,您可以逐渐建立起某人硬盘上有哪些文件和目录的画面。异常应该被设计成,如果它们被不可信的代码处理,那么该代码不会从导致异常的任何行为中获悉用户的私有(private)信息。 (LoadPicture 现在提供的有用错误消息少了很多。)

  • 安全和资源管理错误:不清理资源的处理程序正在等待发生资源泄漏。恶意部分信任代码可将资源泄漏用作拒绝服务攻击,故意制造异常情况。

  • 鲁棒性错误:处理程序必须假设程序状态困惑,除非处理特定的外生异常。对于 finally block 尤其如此。当您处理意外异常时,您的程序中完全有可能甚至很可能出现严重困惑。您不知道您的任何子系统是否在工作,如果它们在工作,调用它们会使情况变得更好还是更糟。如果可能,请专注于记录错误并保存用户数据,并尽可能干净地关闭。假设没有什么是正确的。

  • 安全错误:需要撤消具有安全影响的临时全局状态突变任何可能具有敌意的代码都可以运行。恶意代码可以 finally block 运行之前运行!有关详细信息,请参阅我的文章:

http://blogs.msdn.com/ericlippert/archive/2004/09/01/224064.aspx

关于c# - 处理异常时 .Net 中的常见编程错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2883936/

相关文章:

C# 在 "Code-Created"按钮中应用单击事件监听器

c# - 我不明白为什么测试基类中可能的接口(interface)是错误的

.net - 使用 __declspec(thread) 的线程本地存储在 C++/CLI 中失败

.net - 在 Entity Framework 6 中,我无法执行我的数据库初始值设定项?

.net - 如何使用 .NET 从 Access 数据库中操作表

c# - 设置要在并行中使用的内核

vb.net - 创建一个 "clone"的这个对象,不是指向它

c# - 无法从 Asp.Net WebApi 操作方法连接到网站 URL

c# - Where 子句上的 ServiceStack ORMLite JoinAlias

vb.net - 等待进程完成