Что означает «пузыриться в стеке вызовов»? - PullRequest
1 голос
/ 29 марта 2020

Я смотрел учебный курс на веб-сайте Pluralsight по поводу обработки исключений. Инженер сказал:

Обработка ошибок с использованием кода ошибки, нам нужно добавить операторы if или операторы switch для проверки кодов возврата. Ошибка не превращает стек вызовов в код более высокого уровня.

Я не понял это предложение (ошибка не всплывает до стека вызовов до кода более высокого уровня).

1 Ответ

1 голос
/ 29 марта 2020

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

Рассмотрим следующий псевдокод, определяющий функцию:

 int f ()
 {
     ...
     if (/* some condition that indicates an error */) {
         return 1;
     }
     else {
         return 0;
     }
 }

Если вы сейчас просто вызовите функцию f, и произошла ошибка, ничего не произойдет, если вы явно не проверите, если возвращаемое значение указывает на ошибку. В зависимости от характера ошибки, программа, вероятно, продолжит работу в ошибочном состоянии.

Кроме того, все вызывающие код, вызвавшие функцию, не будут уведомлены об этой ошибке, если она явно не будет им возвращена. Это то, что означает "пузыриться". Чтобы проиллюстрировать это, рассмотрим другую функцию, вызывающую первую функцию без проверки на наличие ошибок:

int g ()
{
    ...
    f();
    ...
}

Теперь любой вызывающий абонент, вызывающий g, также не получит никакого признака сбоя f. Это может быть хорошо, если ошибка не влияет на вычисления g и ни на состояние программы в целом. Но если пропущенная обработка происходит из-за ошибки (или лени) программиста и ставит под угрозу результат g (и, возможно, что-либо выше этого в стеке вызовов или во всей программе), никто никогда не будет уведомлен.

За исключением, все наоборот. Если с ними явно не обращаются, они передаются от вызывающего к вызывающему, то есть пузыриваются в стеке вызовов - думайте о воздушных пузырьках в воде, они пузыриваются.

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