Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.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
Exception 使用投掷有什么用处?还有捕获?_Exception - Fatal编程技术网

Exception 使用投掷有什么用处?还有捕获?

Exception 使用投掷有什么用处?还有捕获?,exception,Exception,据我所知,抛出导致异常。 它看起来可以用来测试您的catch异常 它有什么好处/用途?为什么要故意导致异常 为什么在catch中使用throw?似乎它捕获异常只是为了再次引发异常 try { //blah } catch { throw; } 异常是错误处理的机制。例如,您可能会抛出异常,以指示webservice调用已超时,或者向方法提供了错误的输入。其思想是,调用代码知道如何处理这些异常,并能优雅地处理它们——可能是在输入错误的情况下修复错误(通过提示用户),或者通过

据我所知,抛出导致异常。 它看起来可以用来测试您的
catch
异常

  • 它有什么好处/用途?为什么要故意导致异常
  • 为什么在
    catch
    中使用
    throw
    ?似乎它捕获异常只是为了再次引发异常

    try
    {
        //blah
    }
    catch
    {
        throw; 
    }
    

    • 异常是错误处理的机制。例如,您可能会抛出异常,以指示webservice调用已超时,或者向方法提供了错误的输入。其思想是,调用代码知道如何处理这些异常,并能优雅地处理它们——可能是在输入错误的情况下修复错误(通过提示用户),或者通过第二次尝试调用


      catch
      块是您处理错误的地方,在某些情况下,您可能希望在运行的方法中执行一些本地清理,但是您仍然需要将错误报告给调用方法,因此您再次抛出异常(或者抛出不同的、可能更通用或特定的异常)然后在调用代码中处理。异常是错误处理的机制。例如,您可能会抛出异常,以指示webservice调用已超时,或者向方法提供了错误的输入。其思想是,调用代码知道如何处理这些异常,并能优雅地处理它们——可能是在输入错误的情况下修复错误(通过提示用户),或者通过第二次尝试调用

      catch
      块是您处理错误的地方,在某些情况下,您可能希望在运行的方法中执行一些本地清理,但是您仍然需要将错误报告给调用方法,因此您再次抛出异常(或者抛出不同的、可能更通用或特定的异常)然后在您的呼叫代码中进行处理。

      Description 您可以这样做,例如,记录一些东西,并将异常返回给调用方法/程序集

      您可以处理异常并向调用方发出异常发生的信号,而不是返回指示方法是否成功的
      布尔值

      这对于单元测试和其他测试非常有用

      样品 描述 您可以这样做,例如,记录一些东西,并将异常返回给调用方法/程序集

      您可以处理异常并向调用方发出异常发生的信号,而不是返回指示方法是否成功的
      布尔值

      这对于单元测试和其他测试非常有用

      样品
      这样做会保留堆栈跟踪。在您的示例中,这是没有用的,但是,您可以捕获异常,记录它,然后重试,以便异常冒泡出来,由更高级别的代码处理。

      这样做可以保留堆栈跟踪。在您的示例中,它没有用处,但是,您可以捕获异常,记录它,然后重新刷新,以便异常冒泡出来,由更高级别的代码处理。

      throw重新引发当前异常。它用于当您希望捕获异常并自己进行一些处理,但在其他情况下仍然希望该异常或多或少地传播,就好像您从未捕获它一样

      不同之处在于(在只允许您说
      throw;
      ,如C#)的语言中,当您重新抛出异常时,原始堆栈跟踪基本保持不变。(它包括重新触发异常的行,而不是在相应的
      try
      块中发生异常的行,但在其他情况下,整个堆栈跟踪将保留。)如果说
      抛出捕获的异常,它通常被视为从那里抛出一个全新的异常——现有的堆栈跟踪被删除,新的堆栈跟踪从此点开始重新引发当前异常。它用于当您希望捕获异常并自己进行一些处理,但在其他情况下仍然希望该异常或多或少地传播,就好像您从未捕获它一样


      不同之处在于(在只允许您说
      throw;
      ,如C#)的语言中,当您重新抛出异常时,原始堆栈跟踪基本保持不变。(它包括重新触发异常的行,而不是在相应的
      try
      块中发生异常的行,但在其他情况下,整个堆栈跟踪将保留。)如果说
      抛出捕获的异常,它通常被视为从那里抛出一个全新的异常——现有的堆栈跟踪被删除,新的堆栈跟踪从此点开始。

      这是.Net代码中的常见模式。当调用方希望记录、包装或对异常作出反应,然后将异常传递回调用方时,可以使用它。比如说

      try { 
        SomeFunction(); 
      } catch { 
        CloseMyResource();
        throw;
      }
      

      throw
      vs
      throw exceptionVariable
      的优点是
      throw
      保留原始堆栈跟踪。下一个捕获异常的人将看到原始堆栈跟踪。这主要是为了跟踪深层调用堆栈中的错误

      这是.Net代码中的常见模式。当调用方希望记录、包装或对异常作出反应,然后将异常传递回调用方时,可以使用它。比如说

      try { 
        SomeFunction(); 
      } catch { 
        CloseMyResource();
        throw;
      }
      

      throw
      vs
      throw exceptionVariable
      的优点是
      throw
      保留原始堆栈跟踪。下一个捕获异常的人将看到原始堆栈跟踪。这主要是为了跟踪深层调用堆栈中的错误

      如果您想在此处执行一些日志记录或进行一些清理,但仍希望调用函数位于调用堆栈的更高位置,以处理相同的异常,则将重新引发相同的异常

      更典型的用途是:

      try {
          // ...
      } catch (EmailException ex) {
          SMS.AlertError("Email is not working", ex);
          throw;
      }
      
      如果您
      抛出ex
      ,则您将
      try {
          // ...
      } catch (Exception ex) {
          WorkFlowProblems.Add(new OrderNotSentException("Email did not work", ex));
          View.ShowError("Could not send order!");
      }
      
      Foo foo = null;
      try{
        foo = new Foo();
      }catch(FooException fe){
        //here you can find out if Foo didn't get instantiated as you wanted it to
      }
      
      //and here you can test if foo is still null.