позволить стеку вызовов раскручивать более одного уровня значения? - PullRequest
0 голосов
/ 13 января 2012

Я слышал фразу:

"разрешить стеку вызовов развернуть более одного уровня"

упоминается при обработке исключений.

Что это значит?

Речь идет о языке C #.

Спасибо

Ответы [ 3 ]

1 голос
/ 13 января 2012

Проще говоря, вы можете представить, что стек вызовов работает следующим образом:

  • Каждый раз, когда вызывается метод / функция, в стек помещается «кадр» .
  • Каждый раз, когда метод / функция возвращает / завершает / завершает работу, "frame" выталкивается из стека.

Таким образом, когда стек вызовов раскручивает более одного уровня, более одного фрейма стека отрывается одновременно - как ряд возвращенных вложенных вызовов методов (а не только одного вызова метода).

С точки зрения исключений:

  • Создание исключения, которое перехватывается в том же методе, не приведет к преждевременному возвращению функции, поэтому стек вообще не «разматывает» какие-либо уровни.
  • Создание исключения, перехваченного в методе прямого вызова / родителя метода, вызвавшего исключение, приведет к преждевременному возврату этого дочернего метода, но не к родительскому методу, поэтому будет вытолкнут ровно один кадр стека.
  • Создание исключения, которое не было перехвачено до тех пор, пока оно не привело к преждевременному завершению многочисленных вызовов методов, «позволит стеку вызовов развернуть более одного уровня».

Извиняюсь за то, что был немного быстр с терминологией.

0 голосов
/ 13 января 2012

В качестве общего принципа лучше всего позволить минимально возможному методу в стеке (особенно там, где он все еще имеет значение или что-то можно с ним сделать) поймать исключение. Это уменьшает избыточные и в противном случае ненужные блоки 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 и дает им гарантию, что исключения из неправильных имен файлов будут обрабатываться.

0 голосов
/ 13 января 2012

Это означает, что исключение может выйти из функции, которая его вызвала, и позволить вызывающей стороне поймать функцию и обработать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...