Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
12
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

8.9.4Оператор return

Оператор return возвращает управление в программу, вызвавшую функцию-член, в которой используется оператор return.

оператор_return: return выражениенеобязательно ;

Оператор return без выражения может использоваться только в функции-члене, не вычисляющей значение, т. е. в методе с типом возвращаемого значения void, методе доступа set для свойства или индексатора, в методах доступа add и remove для события, в конструкторе экземпляров, статическом конструкторе или деструкторе.

Оператор return с выражением может использоваться только в функции-члене, вычисляющей значение, т. е. в методе с типом возвращаемого значения, отличным от void, в методе доступа get для свойства или индексатора или в операторе, определенном пользователем. Должно существовать неявное преобразование (§6.1) типа выражения в тип возвращаемого значения функции-члена, содержащей оператор.

Включение оператора return в блок finally (§8.10) вызывает ошибку времени компиляции.

Оператор return выполняется следующим образом.

  • Если оператор return сопровождается выражением, это выражение вычисляется, и результат неявным способом преобразуется в тип возвращаемого значения члена-функции, содержащей оператор. Результат преобразования становится значением, возвращаемым в вызывающую программу.

  • Если оператор return входит в один или несколько блоков try, с которыми связаны соответствующие блоки finally, управление вначале передается в блок finally самого внутреннего оператора try. Если управление достигает конечной точки блока finally, после этого управление передается в блок finally следующего объемлющего оператора try. Этот процесс повторяется до тех пор, пока не будут выполнены все блоки finally всех объемлющих операторов try.

  • Управление возвращается в вызывающую программу функции-члена, содержащей оператор.

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

8.9.5Оператор throw

Оператор throw генерирует исключение.

оператор_throw: throw выражениенеобязательно ;

Оператор throw с выражением генерирует значение, получаемое в результате вычисления выражения. Выражение должно представлять значение с типом класса System.Exception, или с типом класса, производным от System.Exception, или с типом параметра типа, чьим эффективным базовым классом является System.Exception (или его подкласс). Если результатом вычисления выражения является null, вместо этого генерируется исключение System.NullReferenceException.

Оператор throw без выражения может использоваться только в блоке catch; в этом случае оператор повторно генерирует исключение, уже обрабатываемое этим блоком catch.

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

При генерации исключения управление передается первому предложению catch в объемлющем операторе try, который может обработать исключение. Процесс, протекающий с момента генерации исключения до передачи управления в подходящий обработчик исключений, называется распространением исключения. Распространение исключения сводится к повторению нижеописанных шагов до обнаружения предложения catch, соответствующего данному исключению. В последующем описании точкой генерации первоначально считается место генерации исключения.

  • В текущей функции-члене проверяется каждый оператор try, включающий точку генерации. Для каждого оператора S, начиная с самого внутреннего оператора try и до самого внешнего оператора try, выполняются следующие шаги.

  • Если блок try оператора S содержит точку генерации и оператор S содержит одно или несколько предложений catch, эти предложения catch проверяются в порядке их следования в поисках подходящего обработчика для данного исключения. Первое предложение catch, в котором указан тип исключения или базовый тип для типа исключения, считается подходящим вариантом. Предложение catch общего вида (§8.10) считается подходящим для любого типа исключения. Если подходящее предложение catch найдено, распространение исключения завершается передачей управления в блок с этим предложением catch.

  • В противном случае, если блок try или блок catch оператора S содержит точку генерации и в операторе S имеется блок finally, управление передается в блок finally. Если блок finally генерирует еще одно исключение, обработка текущего исключения прекращается. В противном случае, когда управление достигает конечной точки блока finally, обработка текущего исключения продолжается.

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

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]