예외처리

Exception handling

예외 처리(exception handling)는 컴퓨터 프로그래밍에서 예외(특별한 처리가 필요한 비정상적이거나 예외적인 조건)의 발생에 대응하는 과정을 말합니다.일반적으로 예외는 실행의 정상적인 흐름을 깨고 사전에 등록된 예외 처리기를 실행합니다. 이렇게 실행되는 방법의 세부 사항은 하드웨어 예외인지 소프트웨어 예외인지 여부와 소프트웨어 예외가 구현되는 방법에 따라 달라집니다.특별한 프로그래밍 언어 구성, 인터럽트와 같은 하드웨어 메커니즘 또는 신호와 같은 운영 체제(OS) 프로세스통신(IPC) 기능을 통해 예외 처리가 가능합니다.일부 예외(특히 하드웨어)는 중단된 부분에서 실행이 재개될 수 있도록 주의 깊게 처리할 수 있습니다.

정의.

예외의 정의는 각 절차가 "정상적으로"[1] 종료될 수 있는 일련의 상황인 전제 조건을 가지고 있다는 관찰에 근거합니다.예외 처리 메커니즘을 사용하면 프로시저가 이 전제 조건을 [1]위반한 경우(예: 비정상적인 인수 집합에서 프로시저가 호출된 경우) 예외[2] 제기할 수 있습니다.그러면 예외 처리 메커니즘이 [3]예외를 처리합니다.전제조건과 예외의 정의는 주관적입니다."정상" 상황의 집합은 전적으로 프로그래머에 의해 정의됩니다. 예를 들어 프로그래머가 0으로 나눗셈을 정의되지 않은 것으로 간주하거나, 0을 반환하거나 특별한 "ZERO DIVID" 값(예외의 [4]필요성을 우회)을 반환하는 것과 같은 일부 동작을 고안할 수 있습니다.일반적인 예외로는 잘못된 인수(예: 값이 함수의 도메인 밖에 있음), 사용할 수 없는 리소스(예: 누락된 파일, 하드 디스크 오류 또는 메모리 부족 오류), 루틴에서 특별한 처리가 필요한 정상 상태(예: 주의, 파일 종료)를 감지한 경우 등이 있습니다.

예외 처리는 메커니즘이 정상 반환 값과 잘못된 반환 값을 구별한다는 점에서 반약어 문제를 해결합니다.C와 같이 예외 처리가 내장되지 않은 언어에서 루틴은 공통 반환 코드오류 [5]패턴과 같은 다른 방식으로 오류 신호를 전송해야 합니다.넓은 관점에서 볼 때,[6] 오류는 적절한 예외 부분 집합으로 간주될 수 있고, 오류와 같은 명시적 오류 메커니즘은 예외 [5]처리의 (동사적) 형태로 간주될 수 있습니다."예외"라는 용어는 어떤 것이 잘못되었다는 것을 의미하지 않기 때문에 "오류"보다 선호됩니다. 한 프로시저나 프로그래머가 오류로 간주하는 조건을 다른 프로시저에서는 그렇게 보지 않을 수도 있습니다."예외"라는 용어조차도 오해의 소지가 있을 수 있습니다. 왜냐하면 "특이점"이라는 일반적인 의미는 "특이점"이라는 용어가 자주 발생하지 않거나 특이한 일이 발생했음을 나타내므로, 실제로 예외를 제기하는 것은 [7]프로그램에서 정상적이고 일상적인 상황일 수 있습니다.예를 들어, 연관 배열에 대한 룩업 함수가 키에 연관된 값이 없을 경우 예외를 발생시킨다고 가정합니다.상황에 따라 이 "키 부재" 예외는 성공적인 [8]조회보다 훨씬 더 자주 발생할 수 있습니다.

예외의 범위와 사용에 주요한 영향을 미치는 것은 사회적 압력입니다. 즉, "일반적으로 핵심 도서관에서 볼 수 있는 사용 예시와 기술 서적, 잡지 기사, 온라인 토론 포럼, 그리고 조직의 코드 [9]표준에서 볼 수 있는 코드 예시"입니다.

역사

1951년부터 UNIVAC I에서 최초의 하드웨어 예외 처리가 발견되었습니다.산술 오버플로는 주소 0에서 두 개의 명령을 실행하여 제어를 전송하거나 [10]결과를 수정할 수 있습니다.1960년대와 1970년대에 개발된 소프트웨어 예외 처리.예외 처리는 이후 1980년대부터 많은 프로그래밍 언어에서 널리 채택되었습니다.

하드웨어 예외

하드웨어와 [11]관련하여 예외의 정확한 의미에 대한 명확한 합의는 없습니다.구현 관점에서는 인터럽트와 동일하게 처리됩니다. 프로세서는 현재 프로그램의 실행을 중지하고, 인터럽트 벡터 테이블에서 인터럽트 핸들러를 검색하여 예외 또는 인터럽트 조건을 확인하고, 상태를 저장하고, 제어를 전환합니다.

IEEE 754 부동소수점 예외규정

IEEE 754 부동 소수점 표준의 예외 처리는 일반적으로 예외적인 조건을 가리키며 "일부 특정 피연산자에 대한 작업이 모든 합리적인 응용 프로그램에 적합한 결과를 얻지 못할 때 발생하는 이벤트"로 예외를 정의합니다.이 작업은 기본값 또는 명시적으로 요청된 경우 언어 정의 대체 처리를 호출하여 하나 이상의 예외를 나타낼 수 있습니다."

기본적으로 IEEE 754 예외는 재개 가능하며 서로 다른 예외에 대해 미리 정의된 값(예: 0으로 나누는 예외에 대해 무한대)을 대입하고 예외가 발생했는지 여부를 나중에 확인하기 위한 상태 플래그를 제공함으로써 처리됩니다(IEEE 754 예외 처리의 일반적인 예는 C99 프로그래밍 언어 참조).상태 플래그를 사용하여 가능한 예외 처리 스타일은 다음과 같습니다. 먼저 빠르고 직접적인 구현을 사용하여 식을 계산하고 상태 플래그를 테스트하여 실패 여부를 확인하고 필요한 경우 더 느리고 수치적으로 강력한 [12]구현을 호출합니다.

IEEE 754 표준은 예외적인 조건에서 사용자가 제공하는 예외 처리 루틴의 호출을 지칭하기 위해 "트래핑"이라는 용어를 사용하며 표준의 선택적 기능입니다.이 표준은 제거 가능[12][13][14]특이점을 간결하게 처리하기 위해 값의 기본값이 아닌 대체 후 재개를 구현하는 것을 포함한 몇 가지 사용 시나리오를 권장합니다.

기본값의 사전 대체에 따른 재개의 기본 IEEE 754 예외 처리 동작은 수치 예외에 대한 프로그램 제어의 흐름 변경에 내재된 위험을 방지합니다.예를 들어, 1996년 클러스터 우주선 발사는 산술 오류에 대한 계산을 중단하는 에이다 예외 처리 정책으로 인해 재앙적인 폭발로 끝이 났습니다.William Kahan은 기본 IEEE 754 예외 처리 동작이 이를 [13]방지했을 것이라고 주장합니다.

프로그래밍 언어로

컴퓨터 프로그래밍에는 예외 처리를 위한가지 언어 메커니즘이 존재합니다.예외라는 용어는 일반적으로 예외 상태에 대한 정보를 저장하는 데이터 구조를 나타내는 데 사용됩니다.제어권을 이전하거나 예외를 제기하는 하나의 메커니즘을 스로라고 하는데, 예외는 스로라고 합니다.실행은 캐치에 옮겨집니다.

프로그래밍 언어는 예외가 무엇인지에 대한 개념이 상당히 다릅니다.현대의 언어는 크게 두 그룹으로 [15][note 1]나눌 수 있습니다.

  • 예외가 흐름 제어 구조로 사용되도록 설계된 언어:Ada, Modula-3, ML, OCaml, PL/I, Python, Ruby 등이 이 범주에 속합니다.예를 들어 Python의 반복자는 반복자[16]더 이상 생성하지 않는 항목을 표시하기 위해 반복 중지 예외를 던집니다.
  • 예외가 비정상적이고 예측 불가능하며 오류가 있는 상황을 처리하는 데만 사용되는 언어:C++,[17] Java,[18] C#, Common Lisp, Eiffel 및 Modula-2.

사용자 인터페이스에서

React 및 Vue같은 프론트엔드개발 프레임워크는 [19][20]코드를 실행할 때 오류가 콜 스택에 전파되는 방식과 유사한 방식으로 오류를 사용자 인터페이스(UI) 구성 요소 계층에 전파하는 오류 처리 메커니즘을 도입했습니다.여기서 오류 경계 메커니즘은 일반적인 시도 포착 메커니즘과 유사한 역할을 합니다.따라서 구성 요소는 하위 구성 요소의 오류가 포착되어 처리되고 상위 구성 요소로 전파되지 않도록 보장할 수 있습니다.

예를 들어, Vue에서 구성 요소는 다음을 구현하여 오류를 탐지합니다.errorCaptured

.요소('부모', {     템플릿: '<div><slot><slot><>><>><div><slot><'>',     errorCapture: (오류를 범한, vm, 정보) => 경계심이 있는('오류가 발생했습니다.'); }) .요소('아이', {     템플릿: '<div>{{cause_error}}</div>' }) 

마크업에서 이와 같이 사용할 경우:

<부모>     <어린아이></어린아이> </부모> 

자식 구성 요소에서 발생한 오류를 부모 [21]구성 요소에서 파악하여 처리합니다.

참고 항목

메모들

  1. ^ PL/나는 동적 범위 예외를 사용했습니다.PL/I 예외 처리에는 주의, 파일 끝, 나열된 [citation needed]변수 수정 등 오류가 아닌 이벤트가 포함되었습니다.

참고문헌

  1. ^ a b Cristian, Flaviu (1980). "Exception Handling and Software Fault Tolerance". Proc. 10th Int. Symp. On Fault Tolerant Computing (FTCS-25 reprint ed.) (6): 531–540. CiteSeerX 10.1.1.116.8736. doi:10.1109/TC.1982.1676035. OCLC 1029229019. S2CID 18345469.
  2. ^ Goodenough 1975b, 페이지 683-684
  3. ^ 좋아 1975b, 페이지 684.
  4. ^ 블랙 1982, 페이지 13-15.
  5. ^ a b Lang, Jun; Stewart, David B. (March 1998). "A study of the applicability of existing exception-handling techniques to component-based real-time software technology". ACM Transactions on Programming Languages and Systems. 20 (2): 276. CiteSeerX 10.1.1.33.3400. doi:10.1145/276393.276395. S2CID 18875882. Perhaps the most common form of exception-handling method used by software programmers is the "return-code" technique that was popularized as part of C and UNIX.
  6. ^ 레빈 1977, p. 5.
  7. ^ Liskov, B.H.; Snyder, A. (November 1979). "Exception Handling in CLU" (PDF). IEEE Transactions on Software Engineering. SE-5 (6): 546–558. doi:10.1109/TSE.1979.230191. S2CID 15506879. Retrieved 19 December 2021.
  8. ^ 레빈 1977, 페이지 4.
  9. ^ Kiniry, J. R. (2006). "Exceptions in Java and Eiffel: Two Extremes in Exception Design and Application". Advanced Topics in Exception Handling Techniques (PDF). Lecture Notes in Computer Science. Vol. 4119. pp. 288–300. doi:10.1007/11818502_16. ISBN 978-3-540-37443-5. S2CID 33283674.
  10. ^ Smotherman, Mark. "Interrupts". Retrieved 4 January 2022.
  11. ^ Hyde, Randall. "Art of Assembly: Chapter Seventeen". www.plantation-productions.com. Retrieved 22 December 2021.
  12. ^ a b Xiaoye Li; James Demmel (1994). "Faster Numerical Algorithms via Exception Handling, IEEE Transactions on Computers, 43(8)": 983–992. {{cite journal}}:저널 요구사항 인용 journal=(도움말)
  13. ^ a b W.Kahan (July 5, 2005). "A Demonstration of Presubstitution for ∞/∞" (PDF). Archived (PDF) from the original on March 10, 2012.
  14. ^ Hauser, John R. (March 1996). "Handling floating-point exceptions in numeric programs". ACM Transactions on Programming Languages and Systems. 18 (2): 139–174. doi:10.1145/227699.227701. S2CID 9820157.
  15. ^ Kiniry, J. R. (2006). "Exceptions in Java and Eiffel: Two Extremes in Exception Design and Application". Advanced Topics in Exception Handling Techniques (PDF). Lecture Notes in Computer Science. Vol. 4119. pp. 288–300. doi:10.1007/11818502_16. ISBN 978-3-540-37443-5.
  16. ^ "Built-in Exceptions — Python 3.10.4 documentation". docs.python.org. Retrieved 17 May 2022.
  17. ^ "Stroustrup: C++ Style and Technique FAQ". www.stroustrup.com. Archived from the original on 2 February 2018. Retrieved 5 May 2018.
  18. ^ Bloch, Joshua (2008). "Item 57: Use exceptions only for exceptional situations". Effective Java (Second ed.). Addison-Wesley. p. 241. ISBN 978-0-321-35668-0.
  19. ^ "Error Boundaries". React. Retrieved 2018-12-10.
  20. ^ "Vue.js API". Vue.js. Retrieved 2018-12-10.
  21. ^ "Error handling with Vue.js". CatchJS. Retrieved 2018-12-10.

외부 링크