Синтаксис обработки исключений

редактировать

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

Чаще всего для обработки ошибок используется блок iPad... [catch...] [наконец...], а ошибки с помощью throwзаявление, но есть различия в именах исинтаксисе.

Содержание
  • 1 Каталог синтаксисов обработки исключений
    • 1.1 Ada
    • 1.2 Язык ассемблера
    • 1.3 Bash
    • 1.4 BASIC
    • 1.5 C
      • 1.5.1 Для Microsoft
    • 1.6 C #
    • 1.7 C ++
    • 1.8 Язык разметки ColdFusion (CFML)
      • 1.8.1 Синтаксис скрипта
      • 1.8.2 Синтаксис тега
      • 1.8.3 Специфический синтаксис Railo-Lucee
    • 1.9 D
    • 1.10 Delphi
    • 1.11 Erlang
    • 1.12 F #
    • 1.13 Haskell
    • 1.14 Java
    • 1.15 JavaScript
    • 1.16 Lisp
      • 1.16.1 CommonLisp
    • 1.17 Lua
    • 1.18 Оболочка следующего поколения
    • 1.19 Objective-C
    • 1.20 OCaml
    • 1.21 Perl 5
    • 1.22 PHP
    • 1.23 PowerBuilder
    • 1.24 PowerShell
      • 1.24.1 Версия 1.0
      • 1.24.2 Версия 2.0
    • 1.25 Python
    • 1.26 R
    • 1.27 Rebol
    • 1.28 Rexx
    • 1.29 Ruby
    • 1.30 S-Lang
    • 1.31 Smalltalk
    • 1.32 Swift
    • 1.33 Tcl
    • 1.34 VBScript
    • 1.35 Visual Basic 6
      • 1.35.1 Visual Basic.NET
    • 1.36 Visual Prolog
    • 1.37 X ++
  • 2 Ссылки
  • 3См.Также
Каталог синтаксисы обработки исключений

Ada

Wikibook Программирование на языке Ada имеет страницу по теме: Исключения
Объявления исключений
Some_Error : исключение;
Возбуждение исключений
вызывает Some_Error; вызвать Some_Error с "Недостаточно памяти"; - специальное диагностическое сообщение
Обработка и распространение исключений
с Ada.Exceptions, Ada.Text_IO; процедура Foo - это Some_Error: exception; beginDo_Som ething_Interesting; исключение - Запуск обработчиков исключений, Constraint_Error =>... - Обрабатывать ограничение ошибки, когда Storage_Error =>- Распространить Storage_Error как другое исключение с полезным сообщением, поднимать Some_Error с "Out of memory"; при Error: others =>- обрабатывать все остальные Ada.Text_IO.Put ("Exception:"); Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Name (Ошибка)); Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Message (Ошибка)); конец Foo;

Языкассемблера

Большинство языков ассемблера имеют макроинструкцию или доступные для конкретной системы для перехвата событий события, недопустимые операции, проверка программы, ошибки, переполнение, деление на ноль и другие такие. В мэйнфреймах IBM и Univac был макрос STXIT. Системы Digital Equipment Corporation RT11 имели электрические ловушек для программных ошибок, прерываний ввода-вывода и т.п. DOS имеет адрес прерывания. Microsoft Windows имеетспециальныепрограммные вызовы модулей для перехватаных ошибок.

Bash

#! / Usr / bin / env bash #set -e обеспечить другой механизм ошибок print_error () {echo "произошла ошибка"} trap print_error exit #list сигналов для перехвата tempfile = `mktemp` trap" rm $ tempfile "exit./other.sh || эхо-предупреждение: другие неудачные эхо-сигналы) эхо никогда не выводится

Можно установить ловушку для нескольких ошибок, отвечая на любой сигнал с синтаксисом типа:

trap'echoErrorв строке ${LINENO}' ERR

BASIC

Структура goto / gosub при ошибке используется в BASIC и сильно отличается от современной обработки исключений; в BASIC есть только один глобальный обработчик, тогда как в современной обработке обработчики исключений складываются.

ПРИ ОШИБКЕ GOTO handler OPEN "Somefile.txt" FOR INPUT AS # 1 CLOSE # 1 PRINT "Файл успешно открыт" END обработчик: PRINT "Файл не существует" END 'RESUME может вместо этого, который возвращаетуправление висходноеположение.

C

Наиболее распространенный способ реализации обработки исключений в стандарте C - использование функций setjmp / longjmp :

#include #include #include enum {SOME_EXCEPTION = 1} исключение ; состояние jmp_buf; int main (void) {if (! setjmp (state)) // Попробуйте {if (/ * что-то произошло * /) {exception = SOME_EXCEPTION; longjmp (состояние, 0); // выбросить SOME_EXCEPTION}} else switch (исключение) {case SOME_EXCEPTION: //пойматьSOME_EXCEPTION put ( "SOME_EXCEPTIONпоймано"); перемена; default: // catch... put ("Странное исключение"); } return EXIT_SUCCESS; }

Специфично для Microsoft

Существует два типа:

  • Структурированная обработка исключений (SEH)
  • Векторная обработка исключений (VEH, представленная в Windows XP )

Пример SEH на языке программирования C:

int filterExpression (EXCEPTION_POINTERS * ep) {ep->ContextRecord->Eip + = 8; // инструкция деления может бытьзакодированаот 2 до 8 байтов ret urnEXCEPTION_CONTINUE_EXECUTION;} int main (void) {static int zero; __try {zero = 1 / zero; __asm ​​{nop nop nop nop nop nop nop} printf ("Прошло исключение. \ n");} __except (filterExpression (GetExceptionInformation ())) {printf ("Обработчик вызван. \ n ");} return 0;}

Блок C #

A tryдолжен иметь хотя бы одно предложение catchили finallyи не более одного наконец предложение.

public static void Main () {try{// Код,который может вызватьисключение.} Catch (HttpException ex) {// Обрабатывает HttpException. Объект исключения остается в "ex".} улов (исключение) {// Обрабатывает любое исключение CLR, которое не является HttpExcepti на. // Исключение не может быть определено, на него нельзя ссылаться. } catch {// Обрабатывает все, что может быть сгенерировано, включая исключения, не относящиеся к среде CLR. } finally {// Всегда запускать предложения при выходе из блока try (включая catch)независимо оттого, были ли выброшеныкакие-либоисключения или они были обработаны. // Часто используется для очистки и закрытия ресурсов, обрабатываемых таким файлом. // Не может быть запущен при вызове Environment.FailFast () и в других общесистемных исключительных условиях (например, потеря мощности) или когда процесс завершается сбоем из-за исключения в другом потоке. }}

C ++

#include int main () {try {// сделать что-то (может вызвать исключение)} catch (const std ::exception e) {//обработать исключение e}catch (...){// перехватывает все исключения, которые еще не были перехвачены блоком catch, прежде чем // можно использовать для перехвата исключения неизвестного или нерелевантного типа}}

В C ++ получение ресурса - это инициализация Технику можно использовать для очистки ресурсов в исключительных ситуациях. C ++ намеренно не поддерживает наконец. Внешние скобки для метода не являются обязательными.

Язык разметкиColdFusion (CFML)

Синтаксис скрипта

try {// throw CF9 + throw (type = "TypeOfException", message = "Oops", detail = "xyz") ; // альтернативный синтаксис throw: throw "Oops"; // это эквивалентно значению "сообщение" в приведенном выше примере} catch (любой e) {writeOutput ("Error:" e.message); перебросить; // CF9 +} наконец {// CF9 + writeOutput ("Я бегу, даже если нет ошибок"); }

Документация Adobe ColdFusion

Синтаксис тега

код, который может вызватьисключение  Первый уровень кода обработкиисключений Второй уровень кода обработки исключенийокончательный код

документация Adobe ColdFusion

специфический синтаксис Railo-Lucee

Добавить к стандартному синтаксису выше, диалекты CFML Railo и Lucee разрешить оператор повторить.

Этот оператор возвращает запрос к началу предыдущего блока try.

Пример CFScript:

try {// код, который можетпривести к исключению}catch (any e) {retry; }

Пример синтаксисатега:

D

import std.stdio; // для writefln () int main () {попробуйте {// сделать что-то, что может вызвать исключение} catch (FooException e) {// обработать исключение типа FooException} catch (Object o) {// обработать любые другие исключения writefln ("Необработанное исключение:", o); возврат 1; } return 0; }

В D предложение наконецили метод получение ресурсов - инициализация Заголовок дляочистки ресурсовисключительных.

Delphi

Объявления исключений
type ECustom = class (Exception) // Исключения являются потомками класса Exception. частный FCustomData: SomeType; // Исключения могут иметь собственные расширения. открытый конструктор CreateCustom (Данные: SomeType); // Требуется свойство реализации CustomData: SomeType read FCustomData; конец;
Вызов исключений
вызвать Exception.Create ('Сообщение'); поднять Exception.CreateFmt ('Сообщение созначениями:% d,% d',[значение1, значение2]); // См. Параметрыв SysUtils.Format ().поднять ECustom.CreateCustom (X);
Обработка и распространение исключений
try // Для finally. try // For except.... // Код который может вызвать исключение. кроме C: ECustom do begin... // Обработка ECustom.... если Предикат (C.CustomData), то... end; на S: ESomeOtherException действительно начинается // Распространяется как другое исключение. поднять EYetAnotherException.Create (S.Message);конец; на E: Exceptiondo begin... // Обработка других исключений.поднять; //Распространение. конец; конец; finally // Код для выполнения независимо от того, возникло ли исключение (например, код очистки). конец;

Erlang

пример% опасного кода перехватить бросок: {someError, X} ->ok; % обрабатывает ошибку исключения: X ->ok; % обрабатывает другое исключение _: _ ->ok% обрабатывает все исключения после% clean up end

F #

В дополнение к основанному на OCaml try...с, F # такжеимеет отдельную конструкцию iPad... наконец, котораяимеет то же поведение, что и блок iPad с предложением наконецна других языках.NET.

Для сравнения: это перевод примера C # выше.

Попробуйте () (* Код, который может вызвать исключение. *) С | :? System.Net.WebException as ex ->() (* Обрабатывает WebException. Объект исключения хранится в "ex". *) | :? exn ->() (* Обрабатывает любое исключение CLR. _ ->() (* Обрабатывает все, чтоможет бытьсгенерировано, включая исключение, не относящимися к среде CLR.*) Наконец () (*Всегда запускать при выходе из блока рекомендаций независимо от того, были ли выданы какие-либо исключения Часто используется для очистки и закрытия ресурсов, которые обрабатывают такой файл.Может не запускаться при вызове Environment. аварийно из-за исключения в другом потоке. *)

Для сравнения это перевод пример OCaml.

исключение MyException строки * int (* исключение могут нести нестине *) let _= пример поднять (MyException («недостаточно еды », 2)); print fn" Не достигнуто "спомощью | MyException (s, i) ->printf" MyException:% s,% d \ n "si | e ->(* поймать все исключения *) eprintf" Неожиданное исключение:% O "e; eprintf"% O "e.StackTrace

Haskell

Haskell не имеет спе циального синтаксиса для исключений. Вместо этого iPad/ поймать/ наконец/ и т. Д.. Интерфейс предоставляет функции.

import Prelude скрытие (catch) importControl.Exception instance Exception Int instance ExceptionDouble main = do catch ( catch (throw (42 :: Int)) (\ e->print (0, e :: Double))) (\ e->print (1, e :: Int))

печатает

(1,42)

по аналогии с этим C ++

#include , используя пространство имен std; int main () {try {throw (int) 42;} catch (double e) {cout << "(0," << e << ")" << endl;} catch(int e) {cout << "(1," << e << ")" << endl;} }

Другой пример:

do {- Операторы, в которых могут возникать ошибки} `catch` \ ex ->do { - Операторы, которые выполняются в случаевозникновенияисключения, с привязкой ex к исключению}

чистофункциональным кодом, еслисуществуеттолько одно условие типа Может быть, по умолчанию является экземпляром класса МонадаХаскелл. Более сложное распространение ошибок может быть достигнуто с использованием монад Errorили ErrorT, для которых поддерживаются аналогичные функции (с использованием `catch`).

Java

Викибук Программирование на Java имеетстраницу по теме: Исключения

A блок try должен иметь хотя бы одинперехватить предложениеили наконеци не более одного предложения наконец.

try {// Обычный путь выполнения. выбросить новое EmptyStackException (); } catch (ExampleException ee) {// Работа с ExampleException. } finally {// Всегда запускать предложения при выходе из блока try (включая наконец) независимо от того, были ли выброшены какие-либо исключения или они былиобработаны.// Часто используется для очистки и закрытия ресурсов,обрабатываемых таким файлом. //Неможет быть запущен при вызове System.exit () и в других общесистемных исключительных условиях (например, при потере питания). }

JavaScript

Дизайн JavaScript очень редко допускает громкие / серьезные ошибки. Мягкие / тихие ошибки гораздо более распространены. Серьезные ошибки распространяются на ближайший оператор попробуйте, за которым должно следовать либооднопредложение catch, либо одно предложение наконец, либо оба предложения.

 try{// Заявления, в которых возникают исключение, throw new Error ("error"); } catch (error) {// Операторы, которые выполняются в случае возникновения исключения} finally {// Операторы, которые выполняются позже в любом случае}

Если нет оператора Отправить, тогда веб-страница не вылетает. Скорее, в консоль записывается ошибка, и стек очищается. Однако у JavaScript естьинтереснаяособенность асинхронных точек входа, вызываемых извне. В товремя как на большинстве других языковнекоторая часть кода всегда выполняется постоянно, JavaScript не обязательно должен линейно от начала до конца. Например, прослушиватели событий могут быть вызваны браузером в более поздний момент времени и запущены в изолированном, но контексте с остальной частью кода. Обратите внимание, как приведенный ниже код будет выдавать новую ошибку каждые 4 секунды в течение неопределенногопериодавремени или до закрытия / вкладки / компьютера.

setInterval(function () {throw new Error ("Примерошибки, возникшей с интервалом в 4 секунды.");}, 4000);

Еще одна интересная особенность - полиморфизм: JavaScript может выдавать примитивные значения как ошибки.

попробуйте {бросить 12345; // номер примитива} catch (ошибка) {console.log (error); // записывает 12345 как примитивное число в консоль}

Обратите внимание, что предложение catchявляетсяуниверсальным,которое улавливает все типы ошибок. Нет синтаксической возможностиназначать разные обработчики для разныхошибок, кроме экспериментальных и удаленных в время расширений Gecko много лет назад. Вместо этого можно либо распространить ошибку, используя оператор throwвнутри оператора catch, либо использовать несколько условных случаев. Давайте сравним пример на Java и его грубые эквиваленты на JavaScript.

// Пример на Java try {Integer i = null; i.intValue (); // выдаетисключение NullPointerException} catch (ошибка NullPointerException){// переменная может иметь значение null}catch (ошибка ArithmeticException) {// Обработка проблем с числами}
// Приближение №1 в JavaScript try {// Заявления, в которых есть исключение может быть выброшено var example = null; example.toString (); } catch (error) {if (error.type === "TypeError") {// Переменная может иметь значение null} else if (error.type === "RangeError") {// Решать проблемы счислами}}
//Приближение №2 в JavaScript try {try {// Заявления, в которых могутвозникать исключения var example = null; example.toString (); } catch (error) {if (error.type! == "TypeError") выбросить ошибку; // Переменная может иметь значение null}} catch (error) {if (error.type! == "RangeError") throw error; // Обработка проблем с помощью чисел}

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

новоеобещание (function () {throw new Error ("Примерошибки!");}). Поймать (функция (ошибка) {console.log ("Поймано", ошибка);});

Также обратите внимание, как обработчики событий могут также связываться с обещаниями.

addEventListener ("unhandledrejection", function (event) {console.log (event.reason); event.preventDefault (); // запретить вывод ошибки через console.error в консоль -поведение по умолчанию}); new Prom ise (function () {throw new Error ("Пример ошибки!");});

Наконец,обратите внимание, что поскольку JavaScriptиспользует сборку мусора с меткой и очисткой, никогда не происходит утечки памяти из-за операторов throw, поскольку браузер автоматически очищает мертвые объекты - даже с циклическими ссылками.

try {// Заявления, в которых возникают исключения const obj = {}; obj.selfPropExample = obj; // круговая ссылка throw obj; } catch (error) {//Операторы, которые выполняются в случаеисключения}

Lisp

Common Lisp

(ignore-errors (/ 1 0))(handler-case (progn (print " введитевыражение ") (eval (чтение))) (error (e) (print e))) (unwind-protect (progn (print" введите выражение ") (eval (чтение))) (print" Этот print всегда будет присутствовать, как и наконец. "))

Lua <использует

Lua функции pcallи xpcallс xpcallберется функция действовать как блок поймать.

Предопределенная функция
function foo (x)if x then return x else error "Not a true value" end end function try ( arg) success, value = pcall (foo, arg) ifnot success then print (" Ошибка: «.. tostring (значение)) else print (« Возвращено: ».. tostring (значение)) - Возвращено: привет попытка (ноль) - Ошибка: stdin: 5: Не попытка истинного значения ({}) - Возвращено: table: 00809308, если foo (42), затем вывести "Success" end - Успех
Анонимная функция
, если pcall (function ()- Сделайте что-то, что может вызвать конец) -Выполняется, если защищенный вызов end print «Готово» - всегда будетвыступать

Оболочка следующего поколения

Определение пользователя типа исключения
тип MyError (Ошибка)
Вызов исключения
throw MyError («это произошло»)
Обработка и исключение ений
пыт {# something} catch (e: MyError) {guard e.val = 7 #...} catch (e : MyErro r) {#...} catch (e: Error) {#...}
Игнорирование исключений - попытка безперехвата
try 1/0 # возвращает значение null
Игнорирование исключений - оператор "tor"

"тор" - операторпопробуй-или. В случае какого-либо исключения приоценке аргумента слева оценивается аргумент справа.

1/0 для 20 # оценивается как 20
«блок» - возможность использовать исключение для возврата значений
my_result = block my_block {# «блок» перехватывает исключение, выброшенное при возврате ниже # выполнить расчет, если вычисление_финшн () {my_block.return (42)# выдает исключение}}

Objective-C

Объявления исключений
NSException * exception = [NSException exceptionWit hName: @ "myException" Причина: @ "что угодно"userInfo: nil ];
Вызов исключений
исключение @throw;
Обработка и распространение исключений
@try {...} @catch (SomeException * se) {// Обрабатываем специальный тип исключения....} @catch (NSException * ne) {// Обрабатываем общие исключения.... // Распространение исключения, чтобы оно обрабатывалось наболее высоком уровне. @throw; } @catch (id ue){// Лови все брошенные предметы....} @finally {// Выполняем очистку внезависимости от того, произошло исключение или нет....}

OCaml

исключение MyException строки * int (* исключения могут иметь значение *) let _ = попробуйте поднять (MyException ("недостаточно еды", 2)); print_endline "Не достигнуто" с | MyException (s, i) ->Printf.printf "MyException:% s,% d \ n" s i | e ->(* поймать все исключения *) Printf.eprintf "Неожиданноеисключение:% s" (Printexc.to_string e); (* Еслииспользуется Ocaml>= 3.11, можно также распечатать обратную трассировку: *)Printexc.print_backtrace stderr; (* Необходимо заранеевключить запись обратной трассировки с помощью Printexc.record_backtrace true или установки среды OCAMLRUNPARAM = "b1" *)

Perl 5

Механизм Perl для исключений обработки использует die, чтобы вызвать исключение при заключении в блоке eval {...};. После evalспециальная переменная $ @содержит значение,переданное из die. Однако проблемы с областью видимости могутсделать это правильно некрасивым:

my ($ error, $ failed);{местный $ @; $ failed = not eval {# Код, который может вызвать исключение (с помощью 'die') open (FILE, $ file) || die "Не удалось открыть файл: $!"; а () {строка_процесса ($ _); } закрыть (ФАЙЛ) || die "Не удалось закрыть $ file: $!"; возврат 1; }; $ error = $ @; } if ($ failed) {предупреждение"получена ошибка: $ error"; }

Perl 5.005 добавилвозможность бросать объекты, а также строки. Это позволяет лучшеанализировать и обрабатывать типы исключений.

eval {open (FILE, $ file)|| die MyException :: File->новый ($!); а () {строка_процесса ($ _); } закрыть (ФАЙЛ) || die MyException :: File->новый ($!); }; if ($ @) {# Объект исключения находится в $ @ if ($ @ ->isa ('MyException :: File')) {# Обработка исключения файла} else {# Общая обработка исключений # или повторновызовите с помощью 'die $ @ '}}

Псевдосигнал __DIE__может быть перехвачен для обработки звонков die. Это не подходит для обработки исключений, поскольку является глобальным.Однако его можно использовать для преобразования исключений на основе строк из сторонних пакетов объектов.

локальный $ SIG {__ DIE__} = sub {my $ err = shift; если ($ err->isa ('MyException')) {die $ err; # re-throw} else {# В противном случае создать MyException с $ err в виде строки dieMyException :: Default->new ($ err); }};

Формы,показанные выше, могут быть завершены ошибкой, если глобальнаяпеременная $ @изменяется между моментом возникновения исключения и проверкой в​​операторе if ($ @). Это может происходить в многопоточных средах или даже в однопоточных средах, когда другой код (обычно вызываемый при уничтожении какого-либо объекта) сбрасывает глобальную переменную перед кодом проверки. В следующем примере показано, как избежать этойпроблемы (см. [1] или [2] ; ср. [3] ). Но ценой невозможности использовать возвращаемыезначения:

eval {# Код, который может вызвать исключение (с использованием 'die'), но НЕиспользует оператор return; 1; } или сделайте {# Обработать исключение здесь. Строка исключения находится в $ @};

Несколько модулей в комплексной сети архивов Perl (CPAN ) расширяют базовый механизм:

  • Ошибкапредоставляет набор классов исключений и позволяетиспользовать команду try / throw / catch / final синтаксис.
  • TryCatchи Try :: Tinyоба позволяютиспользовать синтаксис try / catch / finally вместо стандартного для правильной обработки исключений.
  • Exception :: Classбазовый класс и создатель классов для производных классов исключений. Он обеспечивает полную структурированную стека в $ @ ->traceи $ @ ->trace->as_string.
  • Fatalперегружает ранее функции, которые возвращают истина/ ложь, например, открыть, закрыть, прочитать, написатьи т. д. Это позволяетиспользовать встроенные функции и другие функции как если бы они генерировали исключение.

PHP

//Обработка исключительно доступна только в PHP версии 5 и выше. попробуйте {// Код, который может вызвать исключение throw new Exception ('Invalid URL.'); } catch (FirstExceptionClass $ exception) {// Код, обрабатывающий это исключение} catch (SecondExceptionClass $ exception) {// Код, обрабатывающий другое исключение} finally {//Выполняем очистку независимо от того, произошло лиисключение или нет. }

PowerBuilder

Обработка исключительно доступна в PowerBuilder версии 8.0 ивыше.

TRY // Нормальный путь выполнения CATCH (ExampleException ee) // Работа с ExampleException НАКОНЕЦ // Этот дополнительный раздел выполняется после завершения любого из блоков try или catch выше END TRY

PowerShell

Версия 1.0

trap[Исключение] {# Операторы, которые выполняются в случае исключения} #Операторы, которые могут возникнуть в случаеисключения

Версия 2.0

Попробуйте {Import-Module ActiveDirectory} Catch [Exception1] { # операторов, которыевыполняются в случае исключения, соответствующего исключению} Catch [Exception2], [Exception3etc] {# операторов, которые выполняются в случае исключения, соответствующего любому из исключений} Catch {# Операторы, которые выполняются в случае исключения, необрабатываемого более конкретно }

Python

f = None try: f = file ( "aFileName") f.write (could_make_error ())except IOError: print ("Unable для открытия файла ") except: # перехватить все исключения print (" Неожиданная ошибка ") else: # выполняется, если не возникло никаких исключений print (" F ile write завершена успешно ") finally: # действия по очистке, всегда выполняемые, если f: f.close ()

R

tryCatch ({stop (" Здесь сообщается об ошибке ") # по умолчанию S3-класс являетсяsimpleError подклассом error cat («Эта и следующие строки не выполняются,потому что ошибка перехвачена до \ n») stop ( structure (simpleError («mySpecialError message»), class = c («specialError», «error», «condition»)))}, specialError = function (e) {cat ("ловит ошибки класса specialError \ n")}, error = function (e) {cat ("ловит ошибку по умолчанию \ n")}, finally = {cat ( "выполнить некоторую очистку (например, setwd) \ n")})

Rebol

REBOL [Заголовок: "Примеры обработкиисключений и ошибок"]; ПОПРОБУЙТЕ блок; захват ошибки! и преобразование в объект!если ошибка? исключение: попробуйте [1/0][исключение снятия датчика с охраны]; ATTEMPT приводит к значению блока или к значению none при попытке печати ошибки [деление 1 0];Пользовательские исключения могут иметь любой тип данных! пример: func ["Функция, генерирующая исключение"] [throw "Я строка! исключение"] catch [пример]; Исключения, созданные пользователем, также могут быть названы; и функции могутвключать дополнительные сложные атрибуты времени выполнения: func ["Функция для выдачиименованного исключения ошибки" [catch]] [th row / name make error! «Я - ошибка! Исключение» 'прозвище] catch / name [сложное]' прозвище

Rexx

сигнал при остановке; do a=1 say a do 100000 / * задержка * / end end halt: say "Программа была остановлена ​​пользователем" exit

Ruby

begin # Сделайте что-нибудь изящное, чтобы поднять SomeError, "Это сообщение об ошибке ! " # Ой-ой! rescue SomeError # Это выполняется, когда возникает исключение SomeError # rescue AnotherError => error # Здесь на объект исключения ссылается #ʻerror 'переменная rescue # Это перехватывает все исключения, производные от StandardError retry # Это снова выполняет начальныйраздел else # Выполняется только в том случае, если не возникло никаких исключений. Убедитесь # Выполняется всегда, исключение или нет.

S-Lang

try {% code, который может вызвать исключение} catch SomeError: {% codeкоторый обрабатывает это исключение} catch SomeOtherError: {% code, который обрабатывает этоисключение} наконец% optional block {% Этот кодвсегда будет выполняться}

Новые исключения могут быть созданы с использованием функции new_exception,например,

new_exception («MyIOError», IOError, «Моя ошибка ввода-вывода»);

создаст исключение с именем MyIOErrorкак подкласс IOError. Исключения могут быть созданы с помощью оператора throw,который может генерировать произвольные объекты S-Lang.

Smalltalk

["код,который может вызвать исключение"] на: ExceptionCl ass do: [: ex | «код, обрабатывающий исключение»].

Общий механизм обеспечивается сообщением on: do:.Исключения - это обычныеобъекты, которые являются подклассом Error, вы вызываете его, создавая экземпляр и отправляя ему сообщение #signal, например, MyException new signal. Механизм обработки (#on: do:) снова представляет собой обычное сообщение, реализованное с помощью BlockCl osure. Вызванное исключение передается вкачестве параметра в закрытие блока обработки и может быть запрошено, а также может быть отправлено ему #resume для продолжения потокавыполнения.

Swift

Обработка исключений поддерживается начиная с Swift 2.

enum MyException: ErrorType {case Foo (String, Int)} func someFunc () throws {throw MyException.Foo ("notдостаточно еды ", 2)} do {try someFunc () print (" Notarded ")} catch MyException.Foo (let s, let i){print (" MyException: \ (s), \ (i) ")} catch{print ("Неожиданное исключение: \ (ошибка)")}

Tcl

if {[catch {foo} err]} {помещает "Ошибка: $ err"}

Начиная сTcl 8.6, существует такжекоманда try:

try {someCommandWithExceptions} on ok {res opt} {# обрабатывать обычный регистр. } trap ListPattern1 {err opt} {# обрабатывать исключения с кодом ошибки, соответствующим ListPattern1} trap ListPattern2 {err opt} {#...} при ошибке {err opt} {# обрабатывать все остальное. } finall y {# запускаем все команды, которые должныпродукты после блока попробовать. }

VBScript

With New Try: On Error Resume Next 'do Something (рекомендуется только один оператор).Catch: On Error GoTo 0: select Case.Number Case 0' эта строка требуется при использовании 'Case Else' из -за ключевого слова "Есть" в VBScript. Оператор Case 'без исключения Case ERRORNUMBER' обработкаисключений Case Else 'неизвестное исключение End Select: End With' *** Try Class *** Class Try Private mst rDescription Private mlngHelpContext Private mstrHel pFile Private mlngNumber Private mstrSource Public Sub Catch () mstrDescription = Err. Описание mlngHelpContext = Err.HelpCont ext mstrHelpFile = Err. HelpFile ml ngNumber = Err.Number mstrSource = Err.Source End Sub Открытое свойство () Source = mstrSource Номер конечного свойства Public Property Number () Number = mlngNumber Конечное свойство Открытое свойство Get HelpFile () HelpFile = mstrHelpFile Конечное свойство Открытое свойство свойство Get HelpContext () HelpContext = mlngHel pContext Конечное свойство Открытое свойство Получить описание () Description = mst rDescription End Свойство End Class

VisualBasic 6

Синтаксисобработки исключений очень похож на Basic. Обработка ошибок локальна для каждой процедуры.

On Error GoTo HandlerLabel 'При возникновении ошибки переходит к HandlerLabel,которыйопределен в любом месте внутри Function или Sub' или On Error GoTo 0 'отключает обработку ошибок. Ошибкавызывает фатальную ошибку времени выполнения иостанавливает приложение. Установлена ​​ошибка объекта «При ошибке возобновить следующий», но выполнение продолжается при следующейкоманде. Вы все ещеможетеиспользовать объект Err для проверки состояния ошибки. '... Err.Raise 6' Сгенерировать ошибку «Переполнение», используя встроенный объект Err. Если обработчика ошибок нет,вызывающаяпроцедура может перехватить исключение с помощью того же синтаксиса '... finallyLabel:' просто общая меткавнутри процедуры (неофициальная эмуляция разделаfinally из других языков) 'код очистки, всегда выполняется Exit Sub' завершает процедуру ' поскольку мы находимся после оператораExit Sub, следующий кодскрытдля выполнения без ошибок. HandlerLabel: 'определяет общую метку, которая здесь используется для обработки исключений. Если Err.Number = 6, то «Оператор Select Caseобычноявляется лучшим решением Resume finallyLabel», чтобы продолжить выполнение для определенной метки. Как правило,что-то со значением «Наконец» на других языках »или«Возобновить следующее »» продолжает выполнение оператора рядом с «Err.Raise 6» или «Возобновить», продолжает выполнение (повторять)оператор «Err.Raise 6»Конец,если MsgBox Err. Number "" Err.Source "" Erl "" Err.Description "" Err.LastDllError 'показать окно сообщения с важными свойствами ошибки' Erl -этовстроенная глобальная переменная номера строки VB6 (если используется). Обычно используется какая-то надстройка IDE,которая помечает каждую строку кода номером передкомпиляцией. Resume finallyLabel

Пример конкретной (неофициальной) реализации обработки исключений, в которой используется объекткласса «Try».

С новойпопыткой: при ошибке Возобновить Далее 'Создать new object of class "Try" and use it. Then set this object as default. Can be "Dim T As New Try:...... T.Catch'doSomething (only one statement recommended).Catch: On Error GoTo 0: Select Case.Number 'Call Try.Catch() procedure. Th en выключите обработку ошибок. Затем используйте "переключательное" утверждение о результате свойств Try.Number (значение свойства Err.Number встроенного объекта Err) Case ERRORNUMBER 'обработка исключения Case Is <>0' Когда Err.Num ber равенство нулю, не произошло 'неизвестно, кроме ion End Выберите: Завершить на '*** Try Class *** Private mstrDescription As StringPrivatemlngHelpContext As Long Private mstrHelpFile As String Private mlngLastDllError Как длинный частный mlngNumber Как длинный частный mst rSource Как строка Public Sub Catch () mstrDescription = Err. Описание mlngHelpContext = Err.HelpContext mstrHelpFile = Err.HelpFile mlngLastDllError = Err.LastDllError mlngNumber = Err.Number mstr. Err.Source End Sub Открытое свойство Get Source () As String Source = Свойство конца mstrSource Открытое свойство Get Number () As Long Number = mlngNumbe r End Property Открытое свойство Get LastDllError () As Long LastDllError = mlngLastDllError Свойство End Открытое свойство Get HelpFile () As St ring HelpFile = mstrHelpFile Свойство End Открытое свойство GetHelpContext () Пока HelpContext = mlngHelpContext End Свойство Открытое свойство Get Description () As String Description = mstrDescript ion End Property

VisualBasic.NET

A Блок Tryдолжен иметь хотя бы однопредложение Catchили Наконец, предложениеисамоебольшее одно предложение Наконец, предложение.

Попробуйте выполнить код здесь. Перехватить ex как исключение, когда условие»Обработать исключение, когда определенное условие истинно. Объектисключения хранится в ex. Catch ex As ExceptionType 'Обработка исключения указанного типа (например, DivideByZeroException, OverflowExcept ion и т. Д.) Catch ex As Except ion' Обработка исключения (перехват всех исключений неуказанного ранее типа) Исключения CLR. Наконец, всегдазапускатьпри выходе из блока try (включая предложения catch), независимо от того, были ли выданы какие-либо исключения или они были обработаны.'Часто используется для очистки и закрытия ресурсов, которые обрабатываеттакой файл. 'Не может быть запущен при вызове Environment.FailFast () и в других общесистемных исключительных условиях (например, припотере мощности) или при сбоепроцесса из-за исключения в другом потоке. End Try

VisualProlog

try% Блок для защиты отлова TraceIddo% Коддля выполнения в случае исключения; TraceId дает доступ к информации об исключении. В конце концов,% Код будет выполняться независимо,однако другие части будут вести себя end try

X ++

public static voidMain (Args _args) {try {// Код, который может вызвать исключение. } catch (Exception :: Error) // Или любой другой тип исключения. {//Обработка ошибки. } catch {//Обработка любого другого типа исключения, не обработанного ранее.} // Код здесь будет выполняться до техпор, покабудет обнаружено любое исключение. }
Ссылки
См. Также
Последняя правка сделана 2021-05-19 09:29:50
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте