3

谁能解释我在异常处理中使用 throw 吗?当我抛出异常时会发生什么?

4

5 回答 5

13

这意味着“导致”异常。当您“抛出”异常时,您是在说“出了点问题,这里有一些细节”。

然后,您可以“捕获”一个“抛出”异常,以允许您的程序优雅地降级而不是出错和死亡。

于 2009-02-21T13:41:32.087 回答
6

“抛出”异常是触发异常处理的整个过程。

在正常执行过程中,程序中的行是通过循环和分支顺序执行的。当发生某种错误时,会创建一个异常然后抛出。

抛出的异常将修改程序中通常的操作顺序,使得在某处的“catch”块中处理异常之前不会执行“正常”指令。一旦在 catch 块中捕获到异常,并且该 catch 块中的代码被执行(“处理”异常),正常的程序执行将在 catch 块之后立即恢复。

// Do some stuff, an exception thrown here won't be caught.
try
{
  // Do stuff
  throw new InvalidOperationException("Some state was invalid.");
  // Nothing here will be executed because the exception has been thrown
}
catch(InvalidOperationException ex) // Catch and handle the exception
{
  // This code is responsible for dealing with the error condition
  //   that prompted the exception to be thrown.  We choose to name
  //   the exception "ex" in this block.
}
// This code will continue to execute as usual because the exception
//   has been handled.
于 2009-02-21T13:43:24.233 回答
3

当您抛出异常时,您基本上是在说某些情况已经超出了预期调用者处理它的合理方法。它们在无法发出任何形式的构造失败信号的构造函数中特别有用(因为它们没有返回值)。

当您抛出异常时,运行时会沿执行链向上移动,直到找到一个可分配给您抛出的异常类型的catch块。在它在你可能拥有的任何finally块中运行代码的过程中,它允许你(通常)释放你可能获得的任何资源。

于 2009-02-21T13:50:02.317 回答
1

throw 创建要处理的异常。然后,您传递的对象将成为描述异常的数据。

在抛出某些东西之前,没有要处理的异常。

于 2009-02-21T13:43:12.910 回答
1

抛出异常会导致异常在堆栈中上升。有两个主要场景throw

  1. 具有您的代码独有的异常情况

    if(inputVal < 0)
    {
        throw new LessThanZeroCustomException("You cannot enter a value less than zero");
    }
    

    上面的代码假设您编写了一个名为LessThanZeroCustomException. 我实际上不会将其命名为,但Custom名称中的 旨在说明您对此进行了编码。它很可能继承自

  2. 有已被捕获并需要重新抛出的异常情况。造成这种情况的正常原因是日志记录。在大多数情况下,我不喜欢这种模式,因为你最终会花时间一遍又一遍地捕捉、记录和扔东西。try ... catch这是因为大多数人在各个级别都采用这种模式。呸!

简而言之,throw意思是“我发现了一个我无法处理的异常情况,所以我通过抛出异常让使用此代码的人知道”。

于 2009-02-21T14:15:22.333 回答