代码之家  ›  专栏  ›  技术社区  ›  Arnold Zokas

如何在c#/.net中记录抛出的异常[已关闭]

  •  133
  • Arnold Zokas  · 技术社区  · 16 年前

    怎样

    public void MyMethod1()
    {
        MyMethod2();
    
        // also may throw InvalidOperationException
    }
    
    public void MyMethod2()
    {
        System.IO.File.Open(somepath...); // this may throw FileNotFoundException
    
        // also may throw DivideByZeroException
    }
    

    我知道记录异常的标记是:

    /// <exception cref="SomeException">when things go wrong.</exception>
    

    我不明白的是如何记录代码引发的异常 叫来 MyMethod1()

    • 我应该记录 MyMethod2()
    • File.Open() ?

    记录可能的例外情况的最佳方式是什么?

    8 回复  |  直到 15 年前
        1
  •  114
  •   user1228 user1228    16 年前

    您应该记录代码可能引发的每个异常,包括您可能调用的任何方法中的异常。

    另一个您可能希望这样做的地方是,如果您的方法位于API的正面。就像facade将多个接口简化为单个接口一样,API应该将多个异常简化为单个异常。使调用者更容易使用代码。


    为了回答安德鲁的一些担忧(从评论中),有三种类型的例外情况:你不知道的例外情况,你知道但不能做任何事情的例外情况,以及你知道并可以做一些事情的例外情况。

    那些你知道但却无能为力的异常,比如OutOfMemoryExceptions。在极端情况下,您可能希望处理这样的异常,但除非您有一些非常显著的需求,否则您会将它们视为第一类——让它们去吧。你…吗

    你可以再找到一些 guidelines on exception handling here.

        2
  •  102
  •   chills42    13 年前

    你应该使用 standard xml documentation

    /// <exception cref="InvalidOperationException">Why it's thrown.</exception>
    /// <exception cref="FileNotFoundException">Why it's thrown.</exception>
    /// <exception cref="DivideByZeroException">Why it's thrown.</exception>
    public void MyMethod1()
    {
        MyMethod2();
        // ... other stuff here
    }
    
    /// <exception cref="FileNotFoundException">Why it's thrown.</exception>
    /// <exception cref="DivideByZeroException">Why it's thrown.</exception>
    public void MyMethod2()
    {
        System.IO.File.Open(somepath...);
    }
    
    /// <exception cref="FileNotFoundException">Why it's thrown.</exception>
    public void MyMethod3()
    {
        try
        {
            MyMethod2();
        }
        catch (DivideByZeroException ex)
        {
            Trace.Warning("We tried to divide by zero, but we can continue.");
        }
    }
    

    这样做的价值在于,您提供了可能发生的已知异常的文档。如果您使用的是visual studio,则此文档在intellisense中可用,并且可以在以后提醒您(或其他人)可能遇到的异常。

        3
  •  36
  •   Glorfindel Doug L.    6 年前

    通过使用多个优秀的外接程序,您可以简化文档编制过程。其中之一是 GhostDoc ,是Visual Studio的免费外接程序,可生成XML文档注释。此外,如果您使用 ReSharper Agent Johnson Plugin 对于ReSharper,它添加了一个选项来为抛出的异常生成XML注释。

    Exceptional for ReSharper 作为替代方案。。。

    因为ReSharper建议记录 例外情况也是:

    step 1

    步骤2:使用ReSharper的快捷键 (Alt Enter)以添加异常 文件也包括:

    step 2 http://i41.tinypic.com/osdhm

        4
  •  12
  •   Daniel Schaffer    16 年前

    据我所知,使用<例外情况>元素在修饰方法时使用它,而不是异常:

    /// <summary>Does something!</summary>
    /// <exception cref="DidNothingException">Thrown if nothing is actually done.</exception>
    public void DoSomething()
    {
    // There be logic here
    }
    

    可以由调用的其他方法引发的异常应该在这些方法中捕获、处理和记录。可能由.NET引发的异常,或 由您自己的代码引发的事件应该被记录下来。

    至于更具体的问题,也许您可以捕获并抛出自己的定制异常?

        5
  •  4
  •   Rowland Shaw    16 年前

    您的方法合同的一部分应该是检查先决条件是否有效,因此:

    public void MyMethod2()
    {
        System.IO.File.Open(somepath...); // this may throw FileNotFoundException
    }
    

    变成

    /// <exception cref="FileNotFoundException">Thrown when somepath isn't a real file.</exception>
    public void MyMethod2()
    {
        FileInfo fi = new FileInfo( somepath );
        if( !fi.Exists )
        {
            throw new FileNotFoundException("somepath doesn't exists")
        }
        // Maybe go on to check you have permissions to read from it.
    
        System.IO.File.Open(somepath...); // this may still throw FileNotFoundException though
    }
    

    OutOfMemoryException 可以

        6
  •  1
  •   GvS    16 年前

    您应该记录您的方法可能引发的所有异常。

    为了隐藏实现细节,我会尝试自己处理MyMethod2中的一些异常。

        7
  •  1
  •   Jose Jose    16 年前

    事实上,正如已经回答的那样,记录异常的方法是使用XML注释。

    除了插件之外,您还可以使用可以与TFS集成的静态分析工具,以确保记录了异常。

    http://www.josefcobonnin.com/post/2009/01/11/Xml-Documentation-Comments-Exceptions-I.aspx http://www.josefcobonnin.com/post/2009/01/15/Xml-Documentation-Comments-Exceptions-II.aspx

    当做

        8
  •  0
  •   Damien    16 年前

    在您的方法中记录预期的异常,在您的示例中,我会让用户知道该方法可以抛出一个文件未找到异常。