Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异常处理_C#_Exception Handling - Fatal编程技术网

C# 异常处理

C# 异常处理,c#,exception-handling,C#,Exception Handling,我在try-catch块(c#)中有一个代码块。代码块可以引发两个异常(ArgumentException/NullReferenceException) 两个异常中的错误处理代码相同。因此,我可以将错误处理代码保留在ArgumentException捕获块中,并且在nullReferenceException中我可以抛出ArgumentException,因为它后面有一个捕获块。不确定它是否会工作,是否对性能有任何损害,是否是一种良好的编程实践 除了在两个catch块中使用相同的代码,或者使用

我在try-catch块(c#)中有一个代码块。代码块可以引发两个异常(ArgumentException/NullReferenceException)

两个异常中的错误处理代码相同。因此,我可以将错误处理代码保留在ArgumentException捕获块中,并且在nullReferenceException中我可以抛出ArgumentException,因为它后面有一个捕获块。不确定它是否会工作,是否对性能有任何损害,是否是一种良好的编程实践

除了在两个catch块中使用相同的代码,或者使用一个单独的方法来保存错误处理代码之外,我是否别无选择


我不想将错误处理代码保存在单独的方法和调用中

我总是尝试遵循“不重复”原则,即不要重复自己的工作,也就是说,不要放置多余的代码,因为当您需要更新某些内容时,您可能会搞糟某些内容。因此,我建议将公共逻辑放在一个单独的方法中,并从两个异常中调用它。

我始终尝试遵循代表不要重复自己的干式原则,即不要放置冗余代码,因为当您需要更新某些内容时,您可能会搞糟某些内容。因此,我建议将公共逻辑放在一个单独的方法中,并从两个异常调用它

  • 如果在NullReferenceException的捕获范围内抛出ArgumentException,则ArgumentException块根本不会捕获它。它将被抛给更高的渔获量

  • 抛出和捕获异常代价高昂。您真的不应该仅仅为了避免编写两次相同的代码而这样做。为了不重复代码,只需使用通用的处理方法/类

  • 如果在NullReferenceException的捕获范围内抛出ArgumentException,则ArgumentException块根本不会捕获它。它将被抛给更高的渔获量

  • 抛出和捕获异常代价高昂。您真的不应该仅仅为了避免编写两次相同的代码而这样做。为了不重复代码,只需使用通用的处理方法/类


  • 要解决您的问题,您可以创建一个方法,而不是在两个catch块中编写相同的代码

    比如说

    try
    {
        //Code
    }
    catch(NullRefernceException Ex)
    {
       HandleError();
    }
    catch(ArgumentException Ex)
    {
      HandleError();
    }
    

    要解决您的问题,您可以创建一个方法,而不是在两个catch块中编写相同的代码

    比如说

    try
    {
        //Code
    }
    catch(NullRefernceException Ex)
    {
       HandleError();
    }
    catch(ArgumentException Ex)
    {
      HandleError();
    }
    
    保持常规,因为try代码只生成两种类型的异常,并且错误处理总是相同的


    保持常规,因为try代码只生成两种类型的异常,并且错误处理总是相同的

    ArgumentException
    NullReferenceException
    都继承自
    SystemException
    ,那么使用

    try
    {
       //code
    }
    catch(SystemException EX)
    {
       //handle error
    }
    

    ArgumentException
    NullReferenceException
    都继承自
    SystemException
    ,那么使用

    try
    {
       //code
    }
    catch(SystemException EX)
    {
       //handle error
    }
    
    也许你可以

    try
    {
    
    }
    catch(Exception ex)
    {
       if (ex is NullRefernceException || ex is ArgumentException)
       {
         //do something
       } 
       else 
       {
          //maybe re-throw the exception
       }
    }
    
    也许你可以

    try
    {
    
    }
    catch(Exception ex)
    {
       if (ex is NullRefernceException || ex is ArgumentException)
       {
         //do something
       } 
       else 
       {
          //maybe re-throw the exception
       }
    }
    

    请参阅[一次捕获多个异常?]()。请参阅[一次捕获多个异常?]()。@Daniel Joseph:您需要更具体一些。你到底收到了什么错误?如果我从NullReferenceException捕获块抛出ArgumentException,我会得到“ArgumentException Unhandled by the user”错误,消息是Value不在预期范围内。为什么会出现此错误?@Daniel Joseph:这表明你没有“更高”的捕获。因此,您抛出的异常基本上是作为应用程序中未处理的异常出现的。您需要捕获的是方法中的一个
    catch(ArgumentException)
    块,该方法调用您从中抛出此exceptionfine的方法。因此,抛出异常将在调用方法中查找处理。更高的捕获。。谢谢你的回复。@Daniel Joseph:你需要更具体一些。你到底收到了什么错误?如果我从NullReferenceException捕获块抛出ArgumentException,我会得到“ArgumentException Unhandled by the user”错误,消息是Value不在预期范围内。为什么会出现此错误?@Daniel Joseph:这表明你没有“更高”的捕获。因此,您抛出的异常基本上是作为应用程序中未处理的异常出现的。您需要捕获的是方法中的一个
    catch(ArgumentException)
    块,该方法调用您从中抛出此exceptionfine的方法。因此,抛出异常将在调用方法中查找处理。更高的捕获。。谢谢你的回复……这不是一个好习惯。它还将吞下所有其他例外:pNot不是一个好的做法。它还将吞下所有其他例外:p