让调用堆栈放松多个级别意味着什么?

时间:2012-01-13 00:30:20

标签: c# exception exception-handling

我听过这句话:

“让调用堆栈放松多个级别”

在异常处理中被提及。

这是什么意思?

有问题的语言是C#。

由于

3 个答案:

答案 0 :(得分:1)

简单来说,您可以将调用堆栈视为如下:

  • 每次调用方法/函数时,"frame"都会被压入堆栈。
  • 每次方法/函数返回/结束/退出时,都会从堆栈中弹出"frame"

因此,当调用堆栈展开多个级别时,会立即关闭多个堆栈帧 - 就像返回一系列嵌套方法调用(不只是单个方法调用)一样。

就例外而言:

  • 抛出在同一方法中捕获的异常不会导致函数过早返回,因此堆栈根本不会“解开”任何级别。
  • 抛出在抛出异常的方法的直接调用方/父方法中捕获的异常将导致该子方法过早返回,但不会返回父方法,因此将弹出一个堆栈框架。
  • 抛出一个异常但是在它导致许多方法调用过早退出之前没有捕获的异常将“让调用堆栈放松多个级别。”

对于术语有点快速松散道歉。

答案 1 :(得分:0)

这意味着让异常退出抛出它的函数并允许其调用者捕获函数并处理它。

答案 2 :(得分:0)

作为一般原则,最好让堆栈上尽可能低的方法(特别是它仍有意义或可以用它完成的东西)捕获异常。这减少了冗余和其他不必要的try ... catch块,并使大多数适当处理异常的代码实际上包含了这样做的逻辑。

<强>更新

考虑以下相当一般(并且有点人为)的例子:

public abstract class ThrowRandomIOExceptions
{
    public void SafeIOOperation(string fileName, IModel model)
    {
        try
        {
            DoSomeIOOperation(fileName, model);
        }
        catch(FileNotFoundException ex)
        {
            // Handle the exception so the children don't have to.
        }
    }

    public abstract void DoSomeIOOperation(string fileName,  IModel model);
}

public class WriteCSV : ThrowRandomIOExceptions
{
    public void DoSomeIOOperation(string fileName, IModel model)
    {
        // Write the model in comma delimited format
    }
}

public class WriteTSV : ThrowRandomIOExceptions
{
    public void DoSomeIOOperation(string fileName, IModel model)
    {
        // Write the model in tab delimited format
    }
}

处理基类中的FileNotFoundException可以避免子项必须包含自己的try ... catch,并保证不会处理来自不正确文件名的异常。