예외는 차단 오류 입니다.
우선, 모범 사례는 블로킹 오류가 아닌 한 모든 종류의 오류에 대해 예외를 throw하지 않아야합니다 .
오류가 차단 되면 예외를 처리하십시오. 예외가 이미 발생하면 예외이기 때문에 숨길 필요가 없습니다. 사용자에게 알리십시오 (모든 예외를 UI에서 사용자에게 유용한 것으로 다시 포맷해야합니다).
소프트웨어 개발자로 당신의 임무는 방지하기 위해 노력하는 예외적 인 경우 일부 매개 변수 또는 런타임 상황은 예외가 종료 될 수 있습니다. 즉, 예외를 음소거해서는 안되지만 피해야 합니다.
예를 들어 일부 정수 입력에 잘못된 형식이있을 수있는 경우 int.TryParse
대신을 사용하십시오 int.Parse
. "실패하면 단순히 예외를 던지십시오"라고 말하는 대신이 작업을 수행 할 수있는 경우가 많이 있습니다.
예외를 던지는 것은 비싸다.
결국 예외가 발생하면 로그에 예외를 작성하는 대신 예외가 발생하면 모범 사례 중 하나는 첫 번째 예외 처리기에서 예외를 포착하는 것입니다 . 예를 들면 다음과 같습니다.
- ASP.NET : Global.asax Application_Error
- 기타 : AppDomain.FirstChanceException 이벤트 .
내 입장은 로컬 try / catch가 예외를 다른 것으로 번역 할 수있는 특별한 경우를 처리하거나 매우, 매우, 매우, 매우 특별한 경우 (라이브러리 버그) 전체 버그를 해결하기 위해 음소거 해야하는 관련이없는 예외를 던짐).
나머지 경우 :
- 예외를 피하십시오.
- 이것이 가능하지 않은 경우 : 첫 번째 예외 처리기.
- 또는 AOP (PostSharp aspect)를 사용하십시오.
일부 의견에 @thewhiteambit에 대답하는 중 ...
@thewhiteambit는 말했다 :
예외는 치명적인 오류가 아니라 예외입니다! 때로는 오류조차되지 않지만 치명적 오류를 고려하는 것은 예외가 무엇인지 완전히 이해하지 못하는 것입니다.
우선 예외가 어떻게 오류가 될 수 없습니까?
- 데이터베이스 연결이 없습니다 => 예외.
- 일부 유형으로 구문 분석 할 수없는 잘못된 문자열 형식 => 예외
- JSON을 구문 분석하려고 시도하고 입력이 실제로 JSON => 예외가 아닌 동안
null
객체가 예상되는 동안 인수 => 예외
- 일부 라이브러리에는 버그가 있습니다 => 예기치 않은 예외가 발생합니다.
- 소켓 연결이 있고 연결이 끊어집니다. 그런 다음 메시지를 보내려고합니다 => 예외
- ...
우리는 예외가 발생했을 때 1k 건을 나열 할 수 있으며 결국 가능한 모든 사례가 오류 가 될 것 입니다.
예외 는하루가 끝나면 진단 정보를 수집하는 객체이기 때문에 . 메시지가 있고 문제가 발생했을 때 발생합니다.
예외적 인 경우가 없으면 아무도 예외를 던지지 않습니다. 예외 가 발생하면 일단 오류가 발생 하기 때문에 try / catch 사용을 시도 하지 않고 제어 흐름을 구현하기위한 예외가 발생하면 응용 프로그램 / 서비스가 예외적 인 경우에 입력 한 작업을 중지합니다 .
또한 Martin Fowler (Jim Shore)가 출판 한 페일-패스트 패러다임 을 확인하는 것이 좋습니다 . 이것은 얼마 전에이 문서를 읽기 전에도 예외를 처리하는 방법을 항상 이해 한 방법입니다.
[...] 그들을 고려하십시오 치명적 오류는 예외가 무엇인지에 대한 완전히 잘못된 이해입니다.
일반적으로 예외 는 일부 작업 흐름을 차단 하고 사람이 이해할 수있는 오류로 변환하기 위해 처리됩니다. 따라서 예외는 실제로 응용 프로그램 / 서비스의 완전한 충돌을 피하고 문제가 있음을 사용자 / 소비자에게 알리기 위해 오류 사례를 처리하고 처리하는 더 나은 패러다임 인 것 같습니다.
@thewhiteambit에 대한 추가 답변
예를 들어, 데이터베이스 연결이 누락 된 경우 프로그램은 예외적으로 로컬 파일에 계속 기록하고 데이터베이스를 다시 사용할 수있게되면 변경 사항을 데이터베이스에 보낼 수 있습니다. 기본 영어를 Parse ( "1,5")로 시도 할 때 실패하고 완전히 해석되는 독일어 해석으로 다시 시도하는 것과 같이 예외에 대한 언어 로컬 해석을 사용하여 유효하지 않은 문자열 대 숫자 캐스팅을 다시 구문 분석하려고 시도 할 수 있습니다. 점 대신 구분 기호로 쉼표를 사용하기 때문에 좋습니다. 이러한 예외는 차단되어서는 안되며 예외 처리 만 필요합니다.
데이터를 데이터베이스에 유지하지 않고 앱이 오프라인에서 작동 할 수있는 경우 예외를 사용해서는 안됩니다.이를 사용 하여 제어 흐름을 구현 try/catch
하는 것은 안티 패턴으로 간주됩니다. 오프라인 작업은 가능한 유스 케이스이므로 데이터베이스에 액세스 할 수 있는지 여부를 확인하기 위해 제어 플로우를 구현하고 도달 할 수 없을 때까지 기다리지 않습니다 .
파싱 것은 또한 예상되는 경우입니다 ( 예외적하지 CASE ). 이것을 예상하면 예외를 사용하여 흐름을 제어하지 마십시오! . 자신의 문화가 무엇인지 알기 위해 사용자로부터 일부 메타 데이터를 얻고이를 위해 포맷터를 사용합니다! .NET은이 환경과 다른 환경도 지원하며 응용 프로그램 / 서비스의 문화권 별 사용을 기대하는 경우 숫자 형식을 피해야하기 때문에 예외가 발생합니다 .
처리되지 않은 예외는 보통 오류가되지만 예외 자체는 codeproject.com/Articles/15921/Not-All-Exceptions-Are-Errors가 아닙니다.
이 기사는 저자의 의견이나 관점 일뿐입니다.
Wikipedia는 또한 articule author (s)의 의견 일 수 있기 때문에 나는 그것이 교리 라고 말하지는 않지만 일부 기사에서 예외 기사에 의한 코딩이 무엇을 말하는지 확인하십시오 .
[...] 프로그램을 계속하기 위해 발생하는 특정 오류를 처리하기 위해 이러한 예외를 사용하는 것을 예외로 코딩이라고합니다. 이 안티 패턴은 성능 및 유지 관리면에서 소프트웨어를 빠르게 저하시킬 수 있습니다.
또한 어딘가에 말합니다 :
잘못된 예외 사용법
예외에 의한 코딩은 종종 잘못된 예외 사용과 함께 소프트웨어의 추가 문제로 이어질 수 있습니다. 고유 한 문제에 대해 예외 처리를 사용하는 것 외에도 예외가 발생한 후에도 잘못된 예외 사용은 코드를 실행하여 더 많은 문제를 해결합니다. 이 불량한 프로그래밍 방법은 많은 소프트웨어 언어의 goto 방법과 유사하지만 소프트웨어의 문제가 감지 된 후에 만 발생합니다.
솔직히, 나는 소프트웨어를 개발할 수 없다고 믿어 유스 케이스를 심각하게 생각하지 않습니다. 알고 있다면 ...
- 데이터베이스가 오프라인 상태가 될 수 있습니다 ...
- 일부 파일을 잠글 수 있습니다 ...
- 일부 형식이 지원되지 않을 수 있습니다 ...
- 일부 도메인 확인이 실패 할 수 있습니다 ...
- 앱이 오프라인 모드에서 작동해야합니다.
- 어떤 유스 케이스라도 ...
... 당신은 그것에 대한 예외를 사용하지 않습니다 . 당신은 것입니다 지원 일반 제어 흐름을 사용하여 이러한 사용 사례를.
예기치 않은 사용 사례가 다루지 않으면 예외가 발생 하기 때문에 코드가 빠르게 실패 합니다. 예외는 예외적 인 경우 이기 때문 입니다.
반면에, 때로는 예상 예외를 던지는 예외적 인 경우 를 다루지 만 제어 흐름을 구현하기 위해 예외를 던지지는 않습니다. 일부 유스 케이스를 지원하지 않거나 코드가 특정 인수 또는 환경 데이터 / 속성에서 작동하지 않는다는 것을 상위 계층에 알리고 싶기 때문입니다.