답변:
예외 처리 를 허용하는 예외 가있어 충돌을 피할 수 있지만 일반적으로 원치 않거나 예측할 수없는 시스템 동작을 방지합니다. 예를 들어 내 프로그램의 데이터베이스 연결 시간이 초과되면 일반적으로 시스템이 중단되지 않지만 데이터베이스의 데이터에 의존하는 경우 예외가 발생하면이 데이터가없는 상황을 정상과 다르게 처리 할 수 있습니다.
기본적으로 내 프로그램은 데이터베이스에서 반환 된 내용을 기반으로 데이터 페이지를 표시한다고 가정합니다. 잘 모르겠습니다. 데이터가 없습니다. 엉망진창을 제시하거나 잠재적으로 유효하지 않은 작업을 계속하는 대신이 예외를 포착하고 다른 데이터베이스로 폴백하거나 로컬 데이터에서 읽거나 사용자에게 데이터를 요청하거나 사용자 또는 시스템을 안전한 상태 (아마도 하나)로 되돌릴 수 있습니다 즉시 동일한 예외가 발생하지 않습니다!)
또한 사용자 입력이 문제의 원인 / 해결책이 될 수있는 시스템에서 예외는 사용자에게 문제에 대한 상세하고 유용한 정보를 알려줄 수 있습니다. 너무 일반적인 "처리되지 않은 예외가 발생했습니다 ..."또는 "SQL에서 직접 오류 메시지 위협"대신 "자원 B에 연결할 수 없습니다"와 같이 유용하거나 최소한 이해할 수있는 것을 사용자에게 알려줄 수 있습니다.
오류 처리를 단순화하기 위해 예외가 작성되었습니다. 예외없이 오류 처리 논리는 응용 프로그램 전체에 분산되어야합니다. 오류가 발생할 수있는 모든 함수는 어떻게 든 오류 상태를 리턴해야하며 각 호출 다음에 오류 점검이 필요합니다. 호출자는 오류가 발생했을 때 아무 것도 유용하지 않으며 오류 자체 만 반환 할 수 있습니다. 응용 프로그램 코드의 절반이 오류 처리에 전념 할 수 있습니다. 이러한 코드는 매우 취약합니다. 오류 확인 및 충돌을 생략하거나 눈에 띄지 않는 오류로 인해 잘못된 결과를 반환하는 것은 너무 쉽습니다.
예외적으로 처리 할 수있는 지점에서만 오류를 확인할 수 있습니다. 함수는 사용 가능한 값을 반환하거나 예외를 발생시키기 때문에 대부분의 응용 프로그램 코드는 직선 방식으로 작성 될 수 있습니다.
예외 상황은 사용자에게 예외적 인 상황을 알리는 것입니다. 시스템에 문제가 발생하면 프로그램은이를 적절하게 인식하고 처리 할 수 있어야합니다.
즉, 시스템의 "충돌"을 방지하기위한 예외는 없습니다. 예외는 문제가 있음을 알려주는 것입니다. 진행 방법에 따라 시스템이 "충돌"하는지 확인할 수 있습니다.
또한 예외가 말한 것처럼 응용 프로그램을 종료 할 필요는 없습니다. 프로그래머가 예외를 처리하여 사용자에게 의미있는 오류를 수정하거나 설정할 수 있습니다.
* 체크 된 예외 (강제로 잡아야하는 예외)를 사용하는 것은 약간 아픈 부분입니다. 일부 (아마도 대부분) 개발자는 강제 예외 처리가 번거롭고 불필요하며 나쁜 습관임을 알게됩니다.
예외는 오류 처리기에서 오류 위치를 분할하여 최신 오류 처리를 허용합니다. 때때로 이것은 흐름 제어에도 사용됩니다.
처리되지 않은 예외는 프로그램을 종료합니다. 그러나 이것들은 이전의 예외와 다르지 않으며, 모든 경로에 적절한 오류 처리기를 포함하는 것을 잊어 버린 게으른 프로그래머 만 최종 사용자에게 표시됩니다. 예외로 인해 종료 된 프로그램이 다른 예기치 않은 끝과 동일하게 충돌 한 것으로 간주합니다.
OS는 충돌 방식에 관계없이 충돌 한 프로세스를 정리하는 데 매우 적합하므로 예외로 인해 오작동 프로세스를 종료하고 리소스를 해제하는 것 외에 다른 방법으로 OS에 안전을 추가하지 않습니다.
매우 간단합니다.
예외가 발명되기 전에 모든 함수는 종료 코드 (오류 / 성공)를 반환해야 했으며 함수에 설정된 포인터를 전달하여 함수의 결과 또는 출력 을 검색해야했습니다.
문제는 많은 프로그래머가 모든 단일 기능에 대해 잘못된 종료 코드를 확인하는 것을 기억하지 못하고 치명적이므로 치명적 오류가 무시되어 매우 설명 할 수없는 동작이 발생한다는 것입니다.
따라서 결정되었습니다-고려하지 않은 오류가 발생하면 즉시 충돌합니다! 일명 예외 처리.
예외 사항이 할 수있는 정상적인 프로그램의 흐름 분리 로부터 (프로그램이 할 수 있도록 설계되었습니다 무엇을) 오류 처리 흐름을 (어떻게 프로그램이 예외적 인 상황에서 복구하기 위해 노력하고있다).
이를 통해 코드를보다 명확하고 유지 관리하기가 쉽습니다.
두 개의 코드 스 니펫을 고려하십시오.
try:
do1() # this is obvoiusly a normal
do2() # program flow
except:
oups() # this is exception handling code
이것에 비해 :
if foo():
thing1() # is this part of normal program flow?
else:
thing2() # or maybe this one? Or both? When?
물론 다음과 같은 경우 예외 처리를 사용하여 프로그램 충돌을 방지 할 수 있습니다.
try { // very bad code
my();
whole();
ugly();
application();
here();
} catch (Throwable t) {
// pretend it's ok
}
그러나 이것이 현대 프로그래밍 언어에서 예외가 된 이유는 아닙니다.
당신은 또한 사용할 수 있습니다 while
및 break
대신 if
그러나 이것은 것이 아니다 while
와 break
에 대한 것입니다.