C#是否有例外概述?

时间:2010-01-18 11:00:48

标签: c# .net exception

我想知道是否有包含所有异常类型的列表。我知道一些例外,但我不知道所有这些例外情况。有时候我抛出一个Exception,然后我想,也许.NET已经有了这个例外。

例如,现在我需要一个Exception,表示进程不存在(如文件)。

所以我的问题是:有人知道找到所有例外的清单吗?我没找到它。

6 个答案:

答案 0 :(得分:21)

首先,您必须了解什么是例外以及如何处理它。 有一些资源可以帮助您理解这个主题。

  1. “选择正确的例外类型”由Krzysztof Cwalina提出。 http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx

  2. Krzysztof Cwalina的“如何设计异常层次结构”。 http://blogs.msdn.com/kcwalina/archive/2007/01/30/ExceptionHierarchies.aspx

  3. Chris Brumme的例外模式。 http://blogs.msdn.com/cbrumme/archive/2003/10/01/51524.aspx

  4. 可能会有帮助:

    1. “为什么CLR团队博客捕获(异常)/空捕获是坏的”。 http://blogs.msdn.com/b/dotnet/archive/2009/02/19/why-catch-exception-empty-catch-is-bad.aspx

    2. “写出强大的异常处理代码”作者:Bill Wagner。 http://visualstudiomagazine.com/articles/2007/06/01/write-robust-exceptionhandling-code.aspx

    3. “C#:我们是否需要在C#中检查例外”https://blogs.msdn.com/abhinaba/archive/2005/12/16/504373.aspx

    4. Jeffrey Richter在他的书CLR中通过C#构建异常层次结构(p.430,第19章),最近他编写了一个程序,显示最终派生自 System.Exception 的所有类:

      using System;
      using System.Text;
      using System.Reflection;
      using System.Collections.Generic;
      public static class Program
      {
          public static void Main()
          {
              // Explicitly load the assemblies that we want to reflect over
              LoadAssemblies();
              // Initialize our counters and our exception type list
              Int32 totalPublicTypes = 0, totalExceptionTypes = 0;
              List<String> exceptionTree = new List<String>();
              // Iterate through all assemblies loaded in this AppDomain
              foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
              {
                  // Iterate through all types defined in this assembly
                  foreach (Type t in a.GetExportedTypes())
                  {
                      totalPublicTypes++;
                      // Ignore type if not a public class
                      if (!t.IsClass || !t.IsPublic) continue;
                      // Build a string of the type's derivation hierarchy
                      StringBuilder typeHierarchy = new StringBuilder(t.FullName, 5000);
                      // Assume that the type is not an Exception-derived type
                      Boolean derivedFromException = false;
                      // See if System.Exception is a base type of this type
                      Type baseType = t.BaseType;
                      while ((baseType != null) && !derivedFromException)
                      {
                          // Append the base type to the end of the string
                          typeHierarchy.Append("-" + baseType);
                          derivedFromException = (baseType == typeof(System.Exception));
                          baseType = baseType.BaseType;
                      }
                      // No more bases and not Exception-derived, try next type
                      if (!derivedFromException) continue;
                      // We found an Exception-derived type
                      totalExceptionTypes++;
                      // For this Exception-derived type,
                      // reverse the order of the types in the hierarchy
                      String[] h = typeHierarchy.ToString().Split('-');
                      Array.Reverse(h);
                      // Build a new string with the hierarchy in order
                      // from Exception -> Exception-derived type
                      // Add the string to the list of Exception types
                      exceptionTree.Add(String.Join("-", h, 1, h.Length - 1));
                  }
              }
              // Sort the Exception types together in order of their hierarchy
              exceptionTree.Sort();
              // Display the Exception tree
              foreach (String s in exceptionTree)
              {
                  // For this Exception type, split its base types apart
                  string[] x = s.Split('-');
                  // Indent based on the number of base types
                  // and then show the most-derived type
                  Console.WriteLine(new String(' ', 3 * x.Length) + x[x.Length - 1]);
              }
              // Show final status of the types considered
              Console.WriteLine("\n---> of {0} types, {1} are " +
              "derived from System.Exception.",
              totalPublicTypes, totalExceptionTypes);
          }
          private static void LoadAssemblies()
          {
              String[] assemblies = {
                      "System, PublicKeyToken={0}",
                      "System.Data, PublicKeyToken={0}",
                      "System.Design, PublicKeyToken={1}",
                      "System.DirectoryServices, PublicKeyToken={1}",
                      "System.Drawing, PublicKeyToken={1}",
                      "System.Drawing.Design, PublicKeyToken={1}",
                      "System.Management, PublicKeyToken={1}",
                      "System.Messaging, PublicKeyToken={1}",
                      "System.Runtime.Remoting, PublicKeyToken={0}",
                      "System.Security, PublicKeyToken={1}",
                      "System.ServiceProcess, PublicKeyToken={1}",
                      "System.Web, PublicKeyToken={1}",
                      "System.Web.RegularExpressions, PublicKeyToken={1}",
                      "System.Web.Services, PublicKeyToken={1}",
                      "System.Windows.Forms, PublicKeyToken={0}",
                      "System.Xml, PublicKeyToken={0}",
                      };
              String EcmaPublicKeyToken = "b77a5c561934e089";
              String MSPublicKeyToken = "b03f5f7f11d50a3a";
              // Get the version of the assembly containing System.Object
              // We'll assume the same version for all the other assemblies
              Version version =
              typeof(System.Object).Assembly.GetName().Version;
              // Explicitly load the assemblies that we want to reflect over
              foreach (String a in assemblies)
              {
                  String Assemblyldentity =
                  String.Format(a, EcmaPublicKeyToken, MSPublicKeyToken) +
                  ", Culture=neutral, Version=" + version;
                  Assembly.Load(AssemblyIdentity);
              }
          }
      }
      

答案 1 :(得分:9)

Exception Hierarchy

此外,MSDN在Exception class的页面上有一个继承层次结构。但那个只是一个很长的清单,并没有提供太多的细节。

通常,.NET似乎很少有一般的内置异常。

答案 2 :(得分:8)

仅供参考,

如果您使用的是Visual Studio 2008,请转到菜单Debug / Exceptions,您可以看到

中的所有例外情况
  • CLR例外
  • C ++例外
  • 托管调试协助
  • 以及Native RunTime检查。

使用该设置,您可以安排在发生异常之一时执行的操作

查看http://explodingcoder.com/cms/content/visual-studio-fail-how-not-debug-net-exception-handling

答案 3 :(得分:6)

在.NET框架中查看从System.Exception 派生的所有类型的好方法是使用Reflector

  1. 键入F3以搜索“System.Exception”
  2. 选择'System.Exception'类型
  3. 展开“派生类型”树节点。
  4. 请注意,Reflector允许您以动态方式添加任何.NET程序集,这意味着它将在您提供的任何自定义程序集集中搜索System.Exception派生类型。默认情况下会添加最常见的.NET框架程序集。

答案 4 :(得分:3)

Visual Studio代码分析(即FxCop)文档列出了有关抛出现有异常的一般指导。

Do not raise reserved exception types

答案 5 :(得分:2)

您可以在MSDN page for System.Exception(在继承层次结构部分下找到它)的System.Exception派生类型下找到所有已定义的异常。