예외 처리 구문
Exception handling syntax예외 처리 구문은 예외 처리를 허용하기 위해 컴퓨터 프로그래밍 언어에 의해 제공되는 키워드 및/또는 구조의 집합으로, 프로그램 운영 중에 발생하는 오류 처리를 일반 프로세스와 분리합니다.예외처리를 위한 구문은 프로그래밍 언어마다 다르며, 부분적으로 의미적 차이를 다루지만 주로 각 언어의 전체 구문 구조에 맞도록 합니다.일부 언어에서는 관련 개념을 "예외 처리"라고 부르지 않습니다.다른 언어에서는 해당 개념을 위한 직접 설비는 없지만 구현 수단을 제공할 수 있습니다.
에러 처리에서는,try...[catch...][finally...]
에러가 생성되다throw
스테이트먼트는, 이름이나 구문에 큰 차이가 있습니다.
예외 처리 구문 카탈로그
아다

- 예외 선언
일부_오류 : 예외.;
- 예외 발생
올리다 일부_오류; 올리다 일부_오류 와 함께 "메모리 부족"; -- 특정 진단 메시지
- 예외 처리 및 전파
와 함께 Ada. 예외, 아다.텍스트_IO; 절차. 푸우 이 일부_오류 : 예외.; 시작한다. 작업_뭔가_재밌는; 예외. -- 예외 핸들러의 시작 언제 제약_오류 => ... -- 핸들 제약 조건 오류 언제 스토리지_오류 => -- Storage_Error를 다른 예외로 전파하고 유용한 메시지를 표시합니다. 올리다 일부_오류 와 함께 "메모리 부족"; 언제 에러 : 다른이들 => -- 다른 모든 것을 처리합니다. 아다.텍스트_IO.놓다('예외: "); 아다.텍스트_IO.Put_Line(풋_라인)(아다.예외.예외_이름(에러)); 아다.텍스트_IO.Put_Line(풋_라인)(아다.예외.예외_메시지(에러)); 끝. 푸우;
어셈블리 언어
대부분의 어셈블리 언어에는 매크로 명령 또는 인터럽트 주소가 있어 특정 시스템이 불법 운영 코드, 프로그램 검사, 데이터 오류, 오버플로, 0으로 나누기 등의 이벤트를 대행 수신할 수 있습니다.IBM 및 Univac 메인프레임에는 STX가 있습니다.IT 매크로Digital Equipment Corporation RT11 시스템에는 프로그램 오류, I/O 인터럽트 등에 대한 트랩 벡터가 있습니다.DOS에는 특정 인터럽트 주소가 있습니다.Microsoft Windows 에는 프로그램 오류를 트랩하기 위한 특정 모듈 호출이 있습니다.
배쉬
#!/usr/bin/env bash #set -e는 다른 오류 메커니즘 print_error(){ echo "weren error"} 트랩 print_error exit #list 신호를 트랩 tempile="rm $setfile" exit ./other에 제공합니다.sh echo warning: 기타 실패한 에코 oops) 에코가 출력되지 않음
다음과 같은 구문을 사용하여 신호에 응답하여 여러 오류에 대한 트랩을 설정할 수 있습니다.
trap 'echo Error at line ${LINENO}' ERR
기본의
On Error goto/gosub 구조는 BASIC에서 사용되며 현재의 예외 처리와는 크게 다릅니다.BASIC에서는 글로벌핸들러는 1개뿐인데 반해 현대의 예외 처리에서는 예외 핸들러가 스택되어 있습니다.
점등 에러 에 가다 핸들러 열다. "Somefile.txt" 위해서 입력 ~하듯이 #1 가까운. #1 인쇄하다 "파일이 성공적으로 열렸습니다." 끝. 핸들러: 인쇄하다 "파일이 존재하지 않습니다." 끝. 대신 RESUM을 사용하여 컨트롤을 원래 위치로 되돌릴 수 있습니다.
C
C는 예외처리를 직접 지원하지 않습니다.처음부터 오류를 방지하고 함수에서 반환값을 테스트하는 것은 프로그래머의 책임입니다.
어떤 경우에도 표준 C에서 예외 처리를 구현하는 방법은 setjmp/longjmp 함수를 사용하는 것입니다.
#실패하다 < setjmp >h> #실패하다 <stdio.h> #실패하다 <stdlib.h> 열거하다 { SOME_Exception = 1 } 예외.; jmp_buf 주; 인트 주된(무효) { 한다면 (!setjmp(주)) // 시험해 보다 { 한다면 (/* 무슨 일이 일어났어 */) { 예외. = SOME_Exception; 롱점프(주, 0); // SOME_EXCEPTION을 던지다 } } 또 다른 전환하다(예외.) { 사례. SOME_Exception: // SOME_EXCEPTION 포착 놓다("SOME_EXCEPTION 포착"); 브레이크.; 체납: // 캐치... 놓다("뭔가 이상한 예외"); } 돌아가다 종료_SUCCESS; }
Microsoft 고유의
두 가지 유형이 있습니다.
C 프로그래밍 언어의 SEH 예:
인트 filterExpression(필터식) (예외_포인터* ep) { ep->콘텍스트 레코드->이프 += 8; // 분할 명령어는 2 ~8 바이트로 인코딩할 수 있습니다. 돌아가다 예외_계속_EXECUPTION; } 인트 주된(무효) { 정적인 인트 영; __시도하다 { 영 = 1/영; __asm { 하지 않다 하지 않다 하지 않다 하지 않다 하지 않다 하지 않다 하지 않다 } 인쇄물 (예외는 지나쳐라.\n"); } __제외 (filterExpression(필터식) (Get Exception 정보())) { 인쇄물 ("핸들러가 전화했어요.\n"); } 돌아가다 0; }
C#
A try
블록에 하나 이상의 항목이 있어야 합니다.catch
또는finally
기껏해야 하나finally
절을 클릭합니다.
일반의 정적인 무효 주된() { 해라 { // 예외를 발생시킬 수 있는 코드입니다. } 또 만나 (Http Exception(Http Exception) ex) { // HttpException을 처리합니다.예외 개체는 "ex"에 저장됩니다. } 또 만나 (예외.) { // HttpException이 아닌 모든 CLR 예외를 처리합니다. // 예외에 식별자가 지정되지 않았으므로 참조할 수 없습니다. } 또 만나 { // 비 CLR 예외를 포함하여 던질 수 있는 모든 항목을 처리합니다. } 마침내. { // 예외가 발생했는지 또는 처리되었는지 여부에 관계없이 try 블록을 나갈 때(catch 절 포함) 항상 실행됩니다. // 파일 핸들 등의 리소스를 정리하고 닫을 때 자주 사용됩니다. // Environment(환경)FailFast()는 다른 시스템 전체의 예외 조건(전원 손실 등) 또는 다른 스레드의 예외로 인해 프로세스가 크래시 되었을 때 호출됩니다. } }
C++
#실패하다 <blocks> 인트 주된() { 해라 { // 작업(예외가 발생할 수 있음) } 또 만나 (컨스턴트 표준::예외.& e) { // 예외 처리 e } 또 만나 (...) { // 캐치 블록에 의해 아직 포착되지 않은 모든 예외를 포착합니다. // 알 수 없거나 관련이 없는 유형의 예외를 포착하는 데 사용할 수 있습니다. } }
C++ 에서는, 자원 취득의 초기화 기술을 사용해 예외적인 상황에서 자원을 청소할 수 있습니다.C++는 의도적으로 지원하지 않습니다.finally
메서드의 바깥쪽 괄호는 옵션입니다.[1]
ColdFusion Markup Language(CFML)
스크립트 구문
< >cfscript> 해라 { //CF9+를 던지다 던지다(유형="Type Of Exception", 메세지="아이고", 세부 사항="xyz"); // 대체 슬로우 구문: 던지다 "아이고"; // 이 값은 위 예의 "message" 값과 동일합니다. } 또 만나 (조금도 e) { 기입 출력("에러: " & e.메세지); 다시 던지다; //CF9+ } 마침내. { //CF9+ 기입 출력("오류가 없어도 실행"); } < >/cfscript>
Adobe ColdFusion 매뉴얼[2]
태그 구문
예외 <cfcatch...>의 원인이 될 수 있는 <cftry> 코드> <cftry> 예외 처리 코드 첫 번째 레벨 <cfcatch...> 예외 처리 코드 2레벨 </cfcatch> </cffically> 최종 코드 </cftry> </cfcatch> </cftry>
Adobe ColdFusion 매뉴얼[3]
Railo-Lucee 고유 구문
위의 표준 구문에 추가된 Railo와 Lucee의 CFML 방언은 다음과 같습니다.retry
스테이트먼트.[4]
이 문장은 처리를 이전 문장으로 되돌립니다.try
차단합니다.
CFScript의 예:
해라 { // 예외가 발생할 수 있는 코드 } 또 만나 (조금도 e){ 재시도; }
태그 구문 예:
<cftry> <!--- 예외가 발생할 수 있는 코드 ---> <cfcatch> < >외관상> </cfcatch> </cftry>
D
수입품 표준.스태디오; // writefln()의 경우 인트 주된() { 해라 { // 예외가 발생할 수 있는 작업을 수행합니다. } 또 만나 (Foo Exception(예외) e) { // FooException 유형의 예외를 처리합니다. } 또 만나 (물건 o) { // 기타 예외 처리 기입하다("처리되지 않은 예외: ", o); 돌아가다 1; } 돌아가다 0; }
D에서 a는finally
예외적인 상황에서 리소스를 청소하기 위해 리소스 획득 기술을 사용할 수 있습니다.
델파이
- 예외 선언
유형 에코스톰 = 학급(예외.) // 예외는 예외 클래스의 자식입니다. 사적인 FCustom 데이터: Some Type; // 예외에는 사용자 지정 확장자가 있을 수 있습니다. 일반의 컨스트럭터 커스텀 작성(데이터.: Some Type); // 구현 필요 소유물 커스텀 데이터: Some Type 읽어주세요 FCustom 데이터; 끝.;
- 예외 발생
올리다 예외..만들다('메시지'); 올리다 예외..CreateFmt('값이 있는 메시지: %d, %d',[값 1, 값 2]); // "SysUtils" 참조.파라미터의 Format(). 올리다 에코스톰.커스텀 작성(X);
- 예외 처리 및 전파[5]
해라 // 드디어. 해라 // 예외용. ... // 예외가 발생할 수 있는 코드입니다. 제외하고 에 C:에코스톰 하다 시작한다. ... // ECustom을 처리합니다. ... 한다면 술어(C.커스텀 데이터) 그리고나서 ... 끝.; 에 S:ESomeOtherException(ESomeOtherException) 하다 시작한다. // 다른 예외로 전파합니다. 올리다 EYet Another Exception(예외).만들다(S.메세지); 끝.; 에 E:예외. 하다 시작한다. ... // 기타 예외를 처리합니다. 올리다; // 전파. 끝.; 끝.; 마침내. // 예외 발생 여부에 관계없이 실행할 코드(예: 정리 코드). 끝.;
얼랑
해라 위험한 코드(%) 또 만나 던지다:{일부 에러, X} -> 네 알겠습니다; 예외 처리율(%) 에러:X -> 네 알겠습니다; %는 다른 예외를 처리합니다. _:_ -> 네 알겠습니다 %는 모든 예외를 처리합니다. 끝나고 청소율(%) 끝.
F#
OCaml 기반과 더불어try...with
, F# 에는 다음과 같은 기능이 있습니다.try...finally
construct는 try block과 같은 동작을 합니다.finally
절을 지정합니다.NET 언어
비교를 위해 위의 C# 샘플을 번역한 것입니다.
해라 해라 () (* 예외를 발생시킬 수 있는 코드).*) 와 함께 :? 시스템..그물.Web Exception(웹 예외) ~하듯이 ex -> () (* WebException을 처리합니다).예외 객체는 다음 위치에 저장됩니다."ex". *) :? 익스텐 -> () (* CLR 예외를 처리합니다.예외에 식별자가 지정되지 않았으므로 참조할 수 없습니다.*) _ -> () (* CLR 이외의 예외를 포함하여 던질 수 있는 모든 항목을 처리합니다.*) 마침내. () (* 예외가 발생했는지 또는 처리되었는지 여부에 관계없이 항상 try 블록을 떠날 때 실행하십시오. 파일 핸들 등의 리소스를 정리하고 닫을 때 자주 사용됩니다. Environment(환경)에서는 실행되지 않을 수 있습니다.FailFast()는 다른 시스템 전체의 예외 조건(전원 손실 등) 또는 다른 스레드의 예외로 인해 프로세스가 크래시 되었을 때 호출됩니다. *)
비교를 위해 아래 OCaml 샘플 번역입니다.
예외. 마이익스펙션 의 스트링 * 인트 (* 예외는 값을 전달할 수 있습니다*) 허락하다 _ = 해라 올리다 (마이익스펙션 ("식량 부족", 2)); 인쇄 "미달" 와 함께 마이익스펙션 (s, i) -> 인쇄물 "My Exception: %s, %d\n" s i e -> (* 모든 예외 포착*) 인쇄 "예상치 않은 예외: %O" e; 인쇄 %O e.스택 트레이스
하스켈
Haskell에는 예외에 대한 특별한 구문이 없습니다.대신, a는try
/catch
/finally
/etc
. 인터페이스는 함수에 의해 제공됩니다.
수입품 서곡 숨기다(또 만나) 수입품 통제.예외. 사례 예외. 내부 사례 예외. 이중 주된 = 하다 또 만나 (또 만나 (던지다 (42::내부)) (\e-> 인쇄물 (0,e::이중))) (\e-> 인쇄물 (1,e::내부))
인쇄하다
(1,42)
이 C++와 마찬가지로
#실패하다 <iostream> 사용. 네임스페이스 표준; 인트 주된() { 해라 {던지다 (인트)42;} 또 만나(이중으로 하다 e) {외치다 << > "(0," << > e << > ")" << > 끝;} 또 만나(인트 e) {외치다 << > "(1," << > e << > ")" << > 끝;} }
또 다른 예는
하다 { -- 에러가 발생할 수 있는 스테이트먼트 } `또 만나` \ex -> 하다 { -- 예외 발생 시 'ex'가 예외에 바인딩된 스테이트먼트 }
순수하게 기능하는 코드에서는, 에러 상태가 1개만 존재하는 경우,Maybe
타입으로 충분할 수 있으며 Haskell의 인스턴스입니다.Monad
디폴트로 class를 사용하여 보다 복잡한 에러의 전파를 사용해 실시할 수 있습니다.Error
또는ErrorT
유사한 기능(사용)이 있는 모나드`catch`
)가 지원됩니다.
자바
A try
블록에 하나 이상의 항목이 있어야 합니다.catch
또는finally
기껏해야 하나finally
절을 클릭합니다.
해라 { // 일반 실행 경로입니다. 던지다 신규 Empty Stack Exception(빈 스택 예외)(); } 또 만나 (예: 예외 이) { // 예에 대한 대처예외. } 마침내. { // 예외가 발생했는지 또는 처리되었는지 여부에 관계없이 try block(최종 절 포함)에서 나갈 때 항상 실행됩니다. // 파일 핸들 등의 리소스를 정리하고 닫을 때 자주 사용됩니다. // System.exit()가 호출된 경우 및 기타 시스템 전체의 예외 조건(전원 손실 등)에서는 실행되지 않을 수 있습니다. }
자바스크립트
JavaScript 설계로 인해 큰 오류/하드 오류가 거의 발생하지 않습니다.소프트 에러/저소음 에러가 자주 발생합니다.하드 에러는 가장 가까운 에러에 전파됩니다.try
스테이트먼트 뒤에 싱글이 와야 합니다.catch
절, 단일finally
절 또는 둘 다.
해라 { // 예외가 발생할 수 있는 문장 던지다 신규 에러("에러"); } 또 만나(에러) { // 예외 발생 시 실행되는 문장 } 마침내. { // 어떤 식으로든 나중에 실행되는 문장 }
없는 경우try
그러면 웹 페이지가 크래시되지 않습니다.오히려 콘솔에 오류가 기록되고 스택이 클리어됩니다.그러나 JavaScript에는 비동기 외부 호출 진입점이라는 흥미로운 기호가 있습니다.대부분의 다른 언어에서는 항상 코드의 일부가 실행되고 있는 반면 JavaScript는 처음부터 끝까지 직선적으로 실행될 필요가 없습니다.예를 들어 이벤트청취자, Promise 및 타이머는 나중에 브라우저에 의해 호출되어 격리되어 있지만 나머지 코드와 공유된 컨텍스트에서 실행할 수 있습니다.다음 코드가 브라우저/탭/컴퓨터가 닫힐 때까지 4초마다 새로운 오류를 발생시키는 방법을 관찰합니다.
set Interval(기능.() { 던지다 신규 에러("4초 간격으로 발생한 오류의 예"); }, 4000);
또 다른 흥미로운 기호는 다형성입니다. JavaScript는 원시 값을 오류로 던질 수 있습니다.
해라 { 던지다 12345; // 프리미티브 번호 } 또 만나(에러) { 콘솔.로그.(에러); // 콘솔에 12345를 초기 번호로 기록합니다. }
주의:catch
절은 모든 유형의 오류를 포착하는 catch-all입니다.몇 년 전에 실험적으로 현재 제거된 Gecko 확장 기능 외에 다른 오류 유형에 다른 핸들러를 할당할 수 있는 구문 기능은 없습니다.대신에, 에러를 전파하는 방법으로서throw
안에 있는 성명catch
또는 여러 개의 조건부 대소문자를 사용합니다.자바에서의 예와 자바스크립트에서의 대략적인 예를 비교해 보겠습니다.
// Java의 예 해라 { 정수 i = 무효; i.인트밸류(); // Null Pointer를 슬로우합니다.예외. } 또 만나(특수한 포인터예외. 에러) { // 변수가 null일 수 있습니다. } 또 만나(산술 예외 에러) { // 숫자 문제 해결 }
// JavaScript의 근사치 #1 해라 { // 예외가 발생할 수 있는 문장 변화하다 예 = 무효; 예.문자열(); } 또 만나(에러) { 한다면 (에러.유형 === "유형 오류") { // 변수가 null일 수 있습니다. } 또 다른 한다면 (에러.유형 === "RangeErange Error") { // 숫자 문제 해결 } }
// JavaScript의 근사치 #2 해라 { 해라 { // 예외가 발생할 수 있는 문장 변화하다 예 = 무효; 예.문자열(); } 또 만나(에러) { 한다면 (에러.유형 !== "유형 오류") 던지다 에러; // 변수가 null일 수 있습니다. } } 또 만나(에러) { 한다면 (에러.유형 !== "RangeErange Error") 던지다 에러; // 숫자 문제 해결 }
예외의 또 다른 측면은 비동기적으로 예외를 처리하는 약속입니다.예외를 비동기적으로 처리하면 오류 핸들러 내부의 오류가 더 이상 외부로 전파되지 않는다는 이점이 있습니다.
신규 약속.(기능.() { 던지다 신규 에러("예시 오류!"); }).또 만나(기능.(에러) { 콘솔.로그.("잡혔어", 에러); });
또한 이벤트 핸들러가 약속에 어떻게 연결할 수 있는지도 관찰하십시오.
addEventListener("처리되지 않은 거부", 기능.(이벤트) { 콘솔.로그.(이벤트.이유); 이벤트.prevent Default(기본값)(); // console . error console console콘솔에 대한 로그 기록 - 기본 동작 }); 신규 약속.(기능.() { 던지다 신규 에러("예시 오류!"); });
마지막으로 JavaScript는 마크 앤 스위프 가비지 컬렉션을 사용하기 때문에 브라우저가 순환 참조를 사용하더라도 자동으로 데드 오브젝트를 지우므로 throw 스테이트먼트에서 메모리 누수가 발생하지 않습니다.
해라 { // 예외가 발생할 수 있는 문장 컨스턴트 obj = {}; obj.셀프프로포의 예 = obj; // 원형 기준 던지다 obj; } 또 만나(에러) { // 예외 발생 시 실행되는 문장 }
리스프
일반적인 리스프
(무시하다 (/ 1 0)) (핸들러 케이스 (예후 (인쇄물 "식 입력") (평가하다 (읽어주세요))) (에러 (e) (인쇄물 e))) (풀리다 (예후 (인쇄물 "식 입력") (평가하다 (읽어주세요))) (인쇄물 "이 인쇄는 항상 실행되며 최종 인쇄와 비슷합니다."))
루아
Lua는pcall
그리고.xpcall
기능, 사용xpcall
기능으로서 기능하는 것catch
차단합니다.
- 사전 정의된 함수
기능. 후우(x) 한다면 x 그리고나서 돌아가다 x 또 다른 에러 "진정한 값이 아니다" 끝. 끝. 기능. 시도(arg) 성공., 가치 = pcall(후우, arg) 한다면 것은 아니다. 성공. 그리고나서 인쇄물("에러: " .. 스트링(가치)) 또 다른 인쇄물("반환됨: " .. 스트링(가치)) 끝. 끝. 시도("안녕하세요") --반환:안녕하세요 시도(제로) -- 오류: stdin: 5:실제 값이 아닙니다. 시도({}) -- 반환: 테이블: 00809308 한다면 후우(42) 그리고나서 인쇄물 '성공' 끝. -- 성공
- 어나니머스 함수
한다면 pcall( 기능.() -- 에러가 발생할 가능성이 있는 조작을 실시합니다. 끝.) 그리고나서 인쇄물 "오류 없음" -- 보호 콜이 성공했을 때 실행됩니다. 또 다른 인쇄물 "오류 발생" -- 보호 콜이 실패했을 때 실행됩니다. 끝. 인쇄물 "완료" --항상 실행됩니다.
차세대 셸
- 사용자 정의 예외 유형 정의
유형마이 에러(에러)
- 예외 발생
던지다 마이 에러('이렇게 됐어')
- 예외 처리 및 전파
해라 { # 뭔가 } 또 만나(e:마이 에러) { 경비원 e.값 = 7 # ... } 또 만나(e:마이 에러) { # ... } 또 만나(e:에러) { # ... }
- 예외 무시 - 캐치 없이 시도
해라 1/0 #는 null로 평가됩니다.
- 예외 무시 - "tor" 연산자
"tor"는 try or 연산자입니다.왼쪽 인수를 평가할 때 예외가 있는 경우 오른쪽 인수를 평가합니다.
1/0 토루 20 평가수: 20
- "block" - 예외를 사용하여 값을 반환하는 설비
my_result(내 결과) = 블록 my_block { # "블록"은 아래 반환 시 발생하는 예외를 포착합니다. # 계산을 하다 한다면 계산_실행() { my_block.돌아가다(42) # 예외 발생 } }
목표-C
- 예외 선언
NSException(NSException) *예외. = [NSException(NSException) 예외.With Name:@"my Exception" 이유:@"뭐든지" 사용자 정보:제로];
- 예외 발생
@throw(투척) 예외.;
- 예외 처리 및 전파
@try { ... } @parames(@parames) (Some Exception *인식하다) { // 특정 예외 유형을 처리합니다. ... } @parames(@parames) (NSException(NSException) *하지 않다) { // 일반 예외를 처리합니다. ... // 더 높은 수준에서 처리되도록 예외를 전파합니다. @throw(투척); } @parames(@parames) (아이디 ue) { // 던져진 모든 개체를 캡처합니다. ... } @parames(@parames) { // 예외 발생 여부에 관계없이 정리를 수행합니다. ... }
OCaml
예외. 마이익스펙션 의 스트링 * 인트 (* 예외는 값을 전달할 수 있습니다*) 허락하다 _ = 해라 올리다 (마이익스펙션 ("식량 부족", 2)); print_endline "미달" 와 함께 마이익스펙션 (s, i) -> 프린트.인쇄물 "My Exception: %s, %d\n" s i e -> (* 모든 예외 포착*) 프린트.인쇄 "예상치 않은 예외: %s" (프린텍스.스트링 e); (*Ocaml > = 3.11 을 사용하고 있는 경우는, 역추적 인쇄도 가능합니다.* ) 프린텍스.print_backtrace 하드; (* 사전에 백트레이스 녹화를 유효하게 할 필요가 있습니다. Printexc.record_backtrace 참 또는 환경변수 OCAMLRUNPARAM="b1"*)을 설정해 주세요.
Perl 5
예외 처리를 위한 Perl 메커니즘은die
(옷에) 싸서 예외를 두다eval { ... };
블록. 그 후eval
, 특수 변수$@
에서 전달된 값이 포함됩니다.die
.
Perl 5.005에서는 오브젝트 및 스트링을 던지는 기능이 추가되었습니다.이를 통해 예외 유형을 더 잘 검토하고 처리할 수 있습니다.
평가하다 { 열다.(파일, $파일) 죽어버려 My Exception:파일->신규($!); 하는 동안에 (<파일>) { 프로세스_라인($_); } 가까운.(파일) 죽어버려 My Exception:파일->신규($!); }; 한다면 ($@) { # 예외 객체는 $@ 입니다. 한다면 ($@->이사('My Exception: (My Exception:파일')) { # 파일 예외 처리 } 또 다른 { # 일반적인 예외 처리 # 또는 'die $@'를 사용하여 다시 던집니다. } }
그__DIE__
콜을 처리하기 위해 의사 패킷을 트랩할 수 있습니다.die
글로벌하기 때문에 예외 처리에는 적합하지 않습니다.그러나 타사 패키지의 문자열 기반 예외를 개체로 변환하는 데 사용할 수 있습니다.
현지의 $SIG{__DIE__} = 후보선수 { 나의 $err = 교대하다; 한다면 ($err->이사('My Exception')) { 죽어버려 $err; 재투구 횟수 } 또 다른 { # 그렇지 않으면 $err을 문자열로 사용하여 MyException을 작성합니다. 죽어버려 My Exception:: 디폴트->신규($err); } };
글로벌 변수가 다음과 같은 경우 위의 양식이 실패할 수 있습니다.$@
예외 발생 시점과 체크 인 시 사이에 변경된다.if ($@)
진술.이 문제는 멀티 스레드 환경에서 발생할 수 있으며, 단일 스레드 환경에서도 발생할 수 있습니다.또한 체크 코드 전에 다른 코드(일반적으로 일부 오브젝트 파괴로 호출됨)가 글로벌 변수를 리셋할 때 발생합니다.다음으로 이 문제를 회피하는 예를 나타냅니다([1][dead link] 또는 [2]; cf. [3] 참조).그러나 반환값을 사용할 수 없기 때문에 다음과 같은 단점이 있습니다.
평가하다 { # 예외를 발생시킬 수 있지만('die'를 사용), return 문을 사용하지 않는 코드. 1; } 또는 하다 { # 여기서 예외를 처리합니다.예외 문자열은 $@입니다. };
Complexive Perl Archive Network(CPAN; 종합 Perl 아카이브 네트워크)의 여러 모듈은 기본 메커니즘으로 확장됩니다.
Error
는 일련의 예외 클래스를 제공하며 try/throw/slot/slots 구문을 사용할 수 있습니다.TryCatch
그리고.Try::Tiny
둘 다 예외를 올바르게 처리하기 위해 보일러 플레이트 대신 try/signal/signal 구문을 사용할 수 있습니다.Exception::Class
는 파생 예외 클래스의 베이스 클래스 및 클래스 메이커입니다.완전한 구조화 스택트레이스를 제공합니다.$@->trace
그리고.$@->trace->as_string
.Fatal
는 true/false를 반환하는 이전에 정의된 함수를 오버로드합니다.open
,close
,read
,write
내장 기능 등을 예외를 발생시킨 것처럼 사용할 수 있습니다.
PHP
// 예외 처리는 PHP 버전 5 이상에서만 사용할 수 있습니다. 해라 { // 예외를 발생시킬 수 있는 코드 던지다 신규 예외.('유효하지 않은 URL.'); } 또 만나 (First Exception 클래스 $140) { // 이 예외를 처리하는 코드 } 또 만나 (Second Exception 클래스 $140) { // 다른 예외를 처리하는 코드 } 마침내. { // 예외 발생 여부에 관계없이 정리를 수행합니다. }
파워빌더
예외 처리는 PowerBuilder 버전 8.0 이상에서 사용할 수 있습니다.
TRY // 일반 실행 경로 CATCH(예)예외 ee) // 예제 처리예외 FINALY // 이 옵션 섹션은 END TRY 위의 시도 또는 캐치 블록 중 하나가 종료될 때 실행됩니다.
PowerShell
버전 1.0
함정 [예외] { # 예외 발생 시 실행되는 스테이트먼트 } # 예외가 발생할 수 있는 진술
버전 2.0
해라 { Import-Module(모듈 가져오기) Active Directory } 또 만나 [예외1] { # 예외 발생 시 실행되는 문장으로 예외와 일치합니다. } 또 만나 [예외2],[예외 3등] { # 예외 발생 시 실행하는 문장으로 예외 중 하나와 일치합니다. } 또 만나 { # 예외 발생 시 실행되는 스테이트먼트(구체적으로 처리되지 않음) }
파이썬
f = 없음. 해라: f = 열다.("aFileName", "w") f.쓰다(could_make_error(오류 발생)()) 제외하고 IOError: 인쇄물("파일을 열 수 없음") 제외하고: # 모든 예외 포착 인쇄물("예기치 않은 오류") 또 다른: 예외가 발생하지 않을 경우 실행되는 수 인쇄물("파일 쓰기가 성공적으로 완료되었습니다.") 마침내.: 청소 작업 수, 항상 실행 한다면 f: f.가까운.()
R
트라이캐치({ 이제 그만("여기에 오류가 표시됨") # 기본 S3 클래스는 simpleError 오류 하위 클래스입니다. 고양이("이 행과 다음 행은 오류가 발생하기 전에 실행되지 않습니다.\ n ") 이제 그만( 구조.(심플 에러("My SpecialError 메시지"),학급=c("특수 오류","에러",'조건')) ) } ,특수 오류=기능.(e){ 고양이("class special Error\n의 오류를 캐치합니다.") } ,에러=기능.(e){ 고양이("기본 오류 표시\n") } ,마침내.={ 고양이("청소(setwd 등)\n") } )
리볼
리볼 제목: "예외 및 오류 처리 예시" ] ; 블록을 시도합니다. 오류를 캡처하고 개체로 변환합니다. 한다면 에러? 예외: 해라 [1 / 0][탐침 무장 해제하다 예외.] ; Attempt는 오류 시 블록 값 또는 none 값이 됩니다. 인쇄물 시도 [나누다 1 0] ; 사용자가 생성한 예외는 모든 데이터 유형일 수 있습니다! 예: 기능하다 ["예외를 발생시키는 함수" ][ 던지다 "나는 끈이다! 예외" ] 또 만나 [예] ; 사용자가 생성한 예외에 이름을 붙일 수도 있습니다. ; 및 기능에는 추가 실행 시간 속성이 포함될 수 있습니다. 고도의 기능: 기능하다 ["지정된 오류 예외를 발생시키는 함수" [또 만나] ][ 던지다/이름 만들다 에러! "나는 오류다! 예외" '모니커' ] 또 만나/이름 [세련된] '모니커'
렉시
정지 신호; a = 1이 do 100000 /* a do 100000 /* a do a delay */ end end stop: "The program was stoped by the user" exit?
루비
시작한다. # 뭔가 멋진 걸 해 올리다 Some Error, 에러 메시지입니다. # 오오오! 구조. Some Error # 이것은 SomeError 예외가 발생했을 때 실행됩니다. #가 올라갑니다. 구조. Another Error(다른 오류) => 에러 # 여기서 예외 오브젝트는 에서 참조됩니다. # 'error' 변수 구조. # 이것은 Standard Error에서 파생된 모든 예외를 포착합니다. 재시도 # 그러면 시작 섹션이 다시 실행됩니다. 또 다른 # 예외가 발생하지 않은 경우에만 실행됩니다. 확신해주다 # 예외 여부에 관계없이 항상 실행됩니다. 끝.
S랑
예외를 발생시킬 수 있는 { % code } Catch SomeError: { 이 예외를 처리하는 % 코드} Catch SomeOtherError: { 이 예외를 처리하는 % 코드} 마지막으로 % 선택적 블록 { % 이 코드가 항상 실행됩니다.
를 사용하여 새로운 예외를 생성할 수 있습니다.new_exception
기능, 예:
new_exception("My IOError", IOError, "My I/O Error");
라고 하는 예외를 만듭니다.MyIOError
서브클래스로서IOError
예외는 임의의 S-Lang 객체를 던질 수 있는 throw 문을 사용하여 생성할 수 있습니다.
스몰토크
[ "code that may through exception" on : Exception Class do : [ : ex " code that hands exception" ]
일반적인 메커니즘은 메시지에 의해 제공됩니다.on:do:
예외는 서브클래스의 일반 객체입니다.[6]Error
인스턴스를 생성하여 송신함으로써1개를 던집니다.#signal
메시지, 예:MyException new signal
취급 메커니즘(#on:do:
)은, 에 의해서 실장된 통상의 메세지에 지나지 않습니다.BlockClosure
던져진 예외는 처리 블록 폐쇄에 파라미터로 전달되며 쿼리할 수 있으며 잠재적으로 전송될 수도 있습니다.#resume
실행 플로우가 속행되도록 합니다.
재빠르다
예외 처리는 Swift 2 이후 지원됩니다.
열거하다 마이익스펙션 : 에러 타입 { 사례. 푸우(스트링, 내부) } 기능하다 일부 기능() 던지다 { 던지다 마이익스펙션.푸우("식량 부족", 2) } 하다 { 해라 일부 기능() 인쇄물("미달") } 또 만나 마이익스펙션.푸우(허락하다 s, 허락하다 i) { 인쇄물("My Exception:\(s),\(i)") } 또 만나 { 인쇄물("예상치 않은 예외:\(에러)") }
TCL
{ [ catch { foo } err } { } } { " " Error : $err } } 。
Tcl 8.6 이후 try 명령어도 있습니다.
{ some Command }을(를) 사용해 보십시오.OK {res opt} { #에 예외 있음}이(가) 일반 대/소문자를 처리합니다.} 트랩 ListPattern1 {err opt} { # 처리 예외와 ListPattern1 } 트랩 ListPattern2 {err opt} { # ...오류 {err opt} { #이(가) 다른 모든 것을 처리합니다.} 마지막으로 { # try-block 이후에 실행해야 하는 모든 명령을 실행합니다.}
VBScript
와 함께 신규 해라: 에서 에러 이력서 다음 분. '뭔가 실행(권장되는 문장은 1개뿐) .또 만나: 에서 에러 에 가다 0: 선택한다. 사례. .번호 사례. 0 'VBScript Case 문에 "Is" 키워드가 없기 때문에 'Case Else' 절을 사용할 때 이 행이 필요합니다. 예외는 없습니다. 사례. 일부_오류 '취급 처리' 사례. 또 다른 '예외' 끝. 선택한다.: 끝. 와 함께 '** 수업 시작*** 학급 해라 사적인 mstr 설명 사적인 mlng 사적인 mstrHelp 파일 사적인 mlng 사적인 mstr 소스 일반의 후보선수 또 만나() mstr 설명 = 에러.묘사 mlng = 에러.도움말 컨텍스트 mstrHelp 파일 = 에러.도움말 파일 mlng = 에러.번호 mstr 소스 = 에러.원천 끝. 후보선수 일반의 소유물 얻다 원천() 원천 = mstr 소스 끝. 소유물 일반의 소유물 얻다 번호() 번호 = mlng 끝. 소유물 일반의 소유물 얻다 도움말 파일() 도움말 파일 = mstrHelp 파일 끝. 소유물 일반의 소유물 얻다 도움말 컨텍스트() 도움말 컨텍스트 = mlng 끝. 소유물 일반의 소유물 얻다 묘사() 묘사 = mstr 설명 끝. 소유물 끝. 학급
비주얼 베이직 6
예외 처리 구문은 Basic과 매우 유사합니다.오류 처리는 각 절차에서 로컬입니다.
에서 에러 에 가다 핸들러 라벨 '오류가 발생하면 Handler Label로 이동합니다.Handler Label은 Function 또는 Sub 내에서 정의됩니다. '또는 에서 에러 에 가다 0 에러 처리를 오프합니다.오류로 인해 치명적인 런타임 오류가 발생하여 응용 프로그램이 중지됨 '또는 에서 에러 이력서 다음 분. '오브젝트 오류가 설정되었지만 다음 명령에서 실행이 계속됩니다.Err 개체를 사용하여 오류 상태를 확인할 수 있습니다. '... 에러.올리다 6 삽입 객체 Err을 사용하여 "Overflow" 오류를 생성합니다.에러 핸들러가 없는 경우, 콜 프로시저는 같은 구문을 사용해 예외를 검출할 수 있습니다. '... 마지막으로 라벨: '프로시저 내 공통 라벨(다른 언어에서 '최종' 섹션의 공식 에뮬레이션이 아님) '항상 실행되는 코드' 퇴장 후보선수 '종료. 절차. Exit Sub 문 뒤에 있기 때문에 다음 코드는 오류가 없는 실행을 위해 숨겨집니다. 핸들러 라벨: '예외 처리에 사용되는 공통 라벨을 붙입니다. 한다면 에러.번호 = 6 그리고나서 '일반적으로 케이스 스테이트먼트가 더 나은 솔루션 선택' 이력서 마지막으로 라벨 특정 라벨에 대한 실행을 중지합니다.일반적으로 다른 언어로 "Finally"라는 의미를 가진 것 '또는 이력서 다음 분. "Err" 옆에 있는 문에서 실행을 계속합니다.높이 6인치 '또는 이력서 ' (반복) 스테이트먼트에 대한 실행을 계속합니다.Err.높이 6인치 끝. 한다면 메시지 박스 에러.번호 & " " & 에러.원천 & " " & 얼 & " " & 에러.묘사 & " " & 에러.Last Dll Error(최종 Dll 오류) '중요한 오류 속성이 있는 메시지 상자를 표시합니다. 'Erl은 VB6 삽입 라인 번호 글로벌 변수입니다(사용하는 경우).일반적으로 컴파일 전에 모든 코드 행에 번호로 라벨을 붙이는 IDE 애드인(Add-In)이 사용됩니다. 이력서 마지막으로 라벨
클래스 "Try" 객체를 사용하는 예외 처리의 특정(비공식) 구현의 예.
와 함께 신규 해라: 에서 에러 이력서 다음 분. "Try" 클래스의 새 개체를 만들어 사용합니다.그런 다음 이 개체를 기본값으로 설정합니다."Dim T As New Try: ..."가 될 수 있습니다.티캐치 '뭔가 실행(권장되는 문장은 1개뿐) .또 만나: 에서 에러 에 가다 0: 선택한다. 사례. .번호 '통화 시도'Catch() 프로시저그런 다음 오류 처리를 끕니다.그런 다음 시행 결과에 "switch like" 문을 사용합니다.번호 속성(속성 값 Err).삽입 오류 개체 수) 사례. 일부_오류 '취급 처리' 사례. 이 << 고객명 >>님 0 '오류 발생시'번호가 0이고 오류가 발생하지 않았습니다. '예외' 끝. 선택한다.: 끝. 와 함께 '** 수업 시작*** 사적인 mstr 설명 ~하듯이 스트링 사적인 mlng ~하듯이 긴 사적인 mstrHelp 파일 ~하듯이 스트링 사적인 mlng Last Dll 오류 ~하듯이 긴 사적인 mlng ~하듯이 긴 사적인 mstr 소스 ~하듯이 스트링 일반의 후보선수 또 만나() mstr 설명 = 에러.묘사 mlng = 에러.도움말 컨텍스트 mstrHelp 파일 = 에러.도움말 파일 mlng Last Dll 오류 = 에러.Last Dll Error(최종 Dll 오류) mlng = 에러.번호 mstr 소스 = 에러.원천 끝. 후보선수 일반의 소유물 얻다 원천() ~하듯이 스트링 원천 = mstr 소스 끝. 소유물 일반의 소유물 얻다 번호() ~하듯이 긴 번호 = mlng 끝. 소유물 일반의 소유물 얻다 Last Dll Error(최종 Dll 오류)() ~하듯이 긴 Last Dll Error(최종 Dll 오류) = mlng Last Dll 오류 끝. 소유물 일반의 소유물 얻다 도움말 파일() ~하듯이 스트링 도움말 파일 = mstrHelp 파일 끝. 소유물 일반의 소유물 얻다 도움말 컨텍스트() ~하듯이 긴 도움말 컨텍스트 = mlng 끝. 소유물 일반의 소유물 얻다 묘사() ~하듯이 스트링 묘사 = mstr 설명 끝. 소유물
Visual Basic.그물
A Try
블록에 하나 이상의 절이 있어야 합니다.Catch
또는Finally
기껏해야 하나Finally
절을 클릭합니다.
해라 여기서 실행할 코드 또 만나 ex ~하듯이 예외. 언제 조건. ' 특정 조건이 참일 경우 예외를 처리합니다.예외 개체는 "ex"에 저장됩니다. 또 만나 ex ~하듯이 예외.유형 지정된 유형의 예외 처리(예: DivideByZeroException, 오버플로)예외 등) 또 만나 ex ~하듯이 예외. ' 예외 처리(미지정 유형의 모든 예외 캐치) 또 만나 비CLR 예외를 포함하여 던질 수 있는 모든 항목을 처리합니다. 마침내. 예외 발생 여부나 처리 여부에 관계없이 try block(catch 절 포함)에서 나갈 때는 항상 실행되어야 합니다. 파일 핸들 등의 리소스를 정리하고 닫을 때 자주 사용됩니다. ' 환경에서는 실행할 수 없습니다.FailFast()는 다른 시스템 전체의 예외 조건(전원 손실 등) 또는 다른 스레드의 예외로 인해 프로세스가 크래시 되었을 때 호출됩니다. 끝. 해라
비주얼 프롤로그
해라 보호할 블록 비율(%) 또 만나 트레이스 아이디 하다 예외 발생 시 실행할 코드(%). TraceId는 예외 정보에 대한 액세스를 제공합니다. 마침내. % 코드가 실행되지만 다른 부분은 동작합니다. 끝. 해라
X++
일반의 정적인 무효 주된(아르그 _sys) { 해라 { // 예외를 발생시킬 수 있는 코드입니다. } 또 만나 (예외.::에러) // 또는 기타 예외 유형. { // 오류를 처리합니다. } 또 만나 { // 이전에 처리되지 않은 다른 예외 유형을 처리합니다. } // 여기서 코드는 예외가 검출되는 한 실행됩니다. }
레퍼런스
- ^ Bjarne Strostrup의 FAQ
- ^ "Handling exceptions". Archived from the original on 2014-01-02. Retrieved 2014-01-01.
- ^ "Exception handling tags". Archived from the original on 2014-01-02. Retrieved 2014-01-01.
- ^ https://issues.jboss.org/browse/RAILO-2176 # JBoss 커뮤니티 추가 트래커 티켓 발행
retry
- ^ Borland, Dellphi 버전 7.0, 온라인 도움말
- ^ "Pharo by Example". Archived from the original on 2009-10-21. Retrieved 2010-03-20.
- ^ a b VB의 트라이캐치
- ^ http://wiki.visual-prolog.com/index.php?title=Language_Reference/Terms#Try-catch-finally