프로그램이 복구를 시도하지 않아야 하는 예외는 무엇입니까?
예외는 프로그램에 미치는 영향의 정도가 다를 수 있습니다.예를 들어, 프로그램은 아마도 중단되어야 합니다.OutOfMemoryException되지만, 할 수 있습니다.System.Data.SqlClient.SqlException프로그램을 알 수 없는 상태로 만들지 않습니다.
어떤 예외도 제대로 처리되지 않으면 프로그램을 불안정한 상태로 만들 수 있다는 것을 이해합니다.단순히 로그를 기록하고 스택을 토하는 것 이상으로 절대 처리해서는 안 되는 예외가 있습니까?
이것은 케이스 바이 케이스의 이론적인 질문이기 때문에 답은 이론적인 것과 같을 것입니다.제가 들어본 최고의 대답은 "예외를 다루는 방법을 모르면 처리하지 말라"는 것입니다. 메시지를 기록하고 예외를 스택에 올리는 것은 여러분이 실제로 무언가를 했기 때문에 괜찮습니다(오류가 발생했음을 나타내는 것일지라도).그러나 오류를 감지하고 스택을 토하지 않으면 숨겨진 버그와 어려운 디버깅 세션이 발생할 수 있습니다.
우리가 항상 해온 것은 일반적인 오류 처리(예: 메시지 기록, 개발자 알림 등)를 수행하는 최상위 오류 처리기를 구현하는 것입니다.코드에서 더 깊이 처리되지 않은 모든 예외는 적어도 최상위 처리기에서 처리됩니다.코드에서 낮은 수준으로 처리할 수 있는 예외는 발생한 위치에서 처리됩니다.
메일 목록에 메시지를 보내기 위해 전자 메일 주소 목록을 반복하는 경우를 생각해 보십시오.전자 메일 주소 중 하나의 형식이 올바르지 않은 경우 예외가 발생할 수 있지만 하나의 전자 메일 주소로 인해 나머지 처리가 실패하지는 않습니다.발생한 특정 예외 유형을 처리하면 로그에 기록하거나 전자 메일 주소를 잘못된 것으로 표시할 수 있으며 목록의 나머지 부분을 계속 처리할 수 있습니다.
맨 아래 줄:지정된 예외 유형을 처리할지 여부는 예외 유형이 발생할 때 복구할 작업을 코드가 알고 있는지 여부에 따라 결정됩니다.
프레임워크 설계 지침에서는 이에 대해 완전히 설명합니다.
시스템을 잡지 마십시오.예외 또는 시스템.다시 던질 의도가 없는 한 프레임워크 코드의 시스템 예외입니다.
...
시스템을 잡지 마십시오.스택 오버플로예외.
스택 오버플로를 프로그래밍 방식으로 처리하는 것은 매우 어렵습니다.프로세스를 종료하고 디버깅을 사용하여 문제의 원인을 확인하려면 이 예외를 허용해야 합니다.
...
시스템을 잡지 마십시오.런타임.Interop Services.SEHE 예외가 명시적으로 있습니다.
은 다른 수도 오류를 는 다음과 : 다른시오일프오머래암예류다같다외습는니음과는시하이는를로그지.NullReferenceException,IndexOutOfRangeException입니다. 코드에 버그가 있으므로 처리하기보다는 수정해야 한다는 의미입니다.
애플리케이션에 크게 의존합니다.대부분의 애플리케이션은 오류 메시지를 표시하고 다음 기간 동안 중지해야 합니다.OutOfMemoryException하지만 전부는 아닙니다. 예를 들어 SmartRAM(SmartRAM)이라는 프로그램이 해당 예외가 발생할 때까지 점점 더 많은 메모리를 할당하려고 시도하여 RAM을 복구합니다. 이렇게 하면 Windows에서 RAM의 모든 캐시를 삭제하여 더 많은 메모리를 확보할 수 있습니다.
그래서 그것은 정말로 여러분이 무엇을 하느냐에 달려있습니다.응용프로그램 전문가로서 예외에서 안전하게 복구할 수 있다고 생각되는 경우에는 복구해야 합니다.
일반적인 예외 계층에는 런타임 오류와 논리 오류라는 두 가지 주요 분기가 있습니다.전자는 언제든지 나타날 수 있으며 프로그램은 복구 방법에 대한 합리적인 아이디어를 거의 가지고 있지 않으며 후자는 예측하고 처리해야 하는 오류 조건입니다.
Java는 확인된 예외의 구현으로 이 구별을 명확하게 합니다. 예외가 처리되지 않거나 메소드에서 잠재적인 예외 종료로 선언되지 않으면 오류입니다. 그러나 모든 예외가 다음에서 파생된 것입니다.RuntimeException은연중에 괜찮습니다.
프로그램이 적절하게 구획화되어 있고 사용 사례가 허용하는 경우 특정 런타임 예외를 포착하고 예외가 발생한 구획을 종료할 수 있지만, 이는 특수한 경우에만 유용합니다.
이 개념은 Java에서만 적용되지만 여기서도 적용할 수 있습니다.
- 입력 데이터를 구문 분석하지 않는 것은 예외가 발생했을 때 프로그램이 어떤 상태에 있는지 분명하므로 쉽게 처리할 수 있는 예외이므로 정리가 쉽습니다(다음 입력으로 계속).
- 메모리 부족 상태에서 복구하는 것은 쓰기 중에 오류가 발생한 경우 출력 파일을 제거해야 할 수 있기 때문에 더 어렵습니다. 그렇지 않으면 부분 데이터가 발생합니다.
- 프로그램이 잘못된 메모리에 액세스한 경우 이미 다른 내용을 덮어썼을 수 있으므로 복구를 시도하지 않아야 합니다(결국 프로그램은 데이터가 있는 위치를 모르는 것으로 보임). 더 이상 올바르게 작동하는지 보장할 방법이 없습니다.
프로그램에서 예외가 발생하는 위치에 따라 다릅니다.
일반적으로 코드의 개별 섹션에서 원하는 예외를 처리하거나 처리 방법을 알고 나머지는 다른 곳에서 처리하거나 전혀 처리하지 않는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/9689853/which-exceptions-should-a-program-never-attempt-to-recover-from
'programing' 카테고리의 다른 글
| HttpClientBaseAddress가 작동하지 않는 이유는 무엇입니까? (0) | 2023.05.12 |
|---|---|
| Mongo C# 드라이버 - 중첩을 사용하여 동적으로 필터 구축 (0) | 2023.05.12 |
| MongoDB - 집계를 사용하여 배열 해제 및 중복 제거 (0) | 2023.05.07 |
| 에서 밀리초 단위로 잘라내는 방법.NET 날짜 시간 (0) | 2023.05.07 |
| ngFor(Angular 9) 내부의 동적 템플릿 참조 변수 (0) | 2023.05.07 |