기본적으로 시스템 충돌을 방지하기 위해 예외가 있습니까?


16

둘째, 예외 (예외 제어 흐름 영역에서)와 예외 (예 : Java에서 사용됨)의 차이점을 아는 사람이 있는지 궁금합니다.

그러나 기본적으로 사용자 프로그램을 종료하여 시스템 충돌을 방지해야합니까?

답변:


29

예외 처리 를 허용하는 예외 가있어 충돌을 피할 수 있지만 일반적으로 원치 않거나 예측할 수없는 시스템 동작을 방지합니다. 예를 들어 내 프로그램의 데이터베이스 연결 시간이 초과되면 일반적으로 시스템이 중단되지 않지만 데이터베이스의 데이터에 의존하는 경우 예외가 발생하면이 데이터가없는 상황을 정상과 다르게 처리 할 수 ​​있습니다.

기본적으로 내 프로그램은 데이터베이스에서 반환 된 내용을 기반으로 데이터 페이지를 표시한다고 가정합니다. 잘 모르겠습니다. 데이터가 없습니다. 엉망진창을 제시하거나 잠재적으로 유효하지 않은 작업을 계속하는 대신이 예외를 포착하고 다른 데이터베이스로 폴백하거나 로컬 데이터에서 읽거나 사용자에게 데이터를 요청하거나 사용자 또는 시스템을 안전한 상태 (아마도 하나)로 되돌릴 수 있습니다 즉시 동일한 예외가 발생하지 않습니다!)

또한 사용자 입력이 문제의 원인 / 해결책이 될 수있는 시스템에서 예외는 사용자에게 문제에 대한 상세하고 유용한 정보를 알려줄 수 있습니다. 너무 일반적인 "처리되지 않은 예외가 발생했습니다 ..."또는 "SQL에서 직접 오류 메시지 위협"대신 "자원 B에 연결할 수 없습니다"와 같이 유용하거나 최소한 이해할 수있는 것을 사용자에게 알려줄 수 있습니다.


5
이것이 가장 정확한 답변이라고 생각합니다. 프로그램은 작동하는 유한 상태 머신입니다. 잘못된 데이터를 도입하여 기기를 고장 나게하면 기기가 오작동 할 수 있습니다. 이를 방지하기 위해 예외가 발생합니다. 때로는 기계 자체가 복구 될 수 있지만 때로는 복구 할 수 없습니다.
Andy

1
오류 코드로 정확히 같은 작업을 수행 할 수 없습니까? 오류를 반환하고 처리합니다.
mskw

16

오류 처리를 단순화하기 위해 예외가 작성되었습니다. 예외없이 오류 처리 논리는 응용 프로그램 전체에 분산되어야합니다. 오류가 발생할 수있는 모든 함수는 어떻게 든 오류 상태를 리턴해야하며 각 호출 다음에 오류 점검이 필요합니다. 호출자는 오류가 발생했을 때 아무 것도 유용하지 않으며 오류 자체 만 반환 할 수 있습니다. 응용 프로그램 코드의 절반이 오류 처리에 전념 할 수 있습니다. 이러한 코드는 매우 취약합니다. 오류 확인 및 충돌을 생략하거나 눈에 띄지 않는 오류로 인해 잘못된 결과를 반환하는 것은 너무 쉽습니다.

예외적으로 처리 할 수있는 지점에서만 오류를 확인할 수 있습니다. 함수는 사용 가능한 값을 반환하거나 예외를 발생시키기 때문에 대부분의 응용 프로그램 코드는 직선 방식으로 작성 될 수 있습니다.


5

예외 상황은 사용자에게 예외적 인 상황을 알리는 것입니다. 시스템에 문제가 발생하면 프로그램은이를 적절하게 인식하고 처리 할 수 ​​있어야합니다.

즉, 시스템의 "충돌"을 방지하기위한 예외는 없습니다. 예외는 문제가 있음을 알려주는 것입니다. 진행 방법에 따라 시스템이 "충돌"하는지 확인할 수 있습니다.

또한 예외가 말한 것처럼 응용 프로그램을 종료 할 필요는 없습니다. 프로그래머가 예외를 처리하여 사용자에게 의미있는 오류를 수정하거나 설정할 수 있습니다.


* 체크 된 예외 (강제로 잡아야하는 예외)를 사용하는 것은 약간 아픈 부분입니다. 일부 (아마도 대부분) 개발자는 강제 예외 처리가 번거롭고 불필요하며 나쁜 습관임을 알게됩니다.


2
동의하지 않습니다.이 정의가 너무 제한적입니다. 예외의 하위 집합 만 사용자에게 표시되어야합니다. 예외는 오류 처리에 대한 것이며 사용자를 포기하고 알리는 것이 일반적으로 수행 되는 마지막 단계이며 표준이되어서는 안됩니다. 일부 시스템은 iterable의 끝, EOF 등과 같은 일부 흐름 제어에도 예외를 사용하도록 설계되었습니다.
Jürgen Strobel

위르겐, 나는 당신의 의견을 이해하고 완전히 동의합니다. "수정되었거나 의미있는 오류로 바" "-이 말로 그 생각을 전달하지 않습니까?

예, 지금 훨씬 나아졌습니다.
Jürgen Strobel

의심 할 여지없이 사용자에게 예외가 표시 되어서는 안됩니다 . (이를 발생시킨 조건은 어떻게 든 사용자에게보고해야하지만 예외는 아닙니다.) 그러나 예외는 DIAF를 수행하거나 프로그램을 종료하는 것보다 항상 낫습니다. (“발신자 이름을 기준으로 이메일을 정렬하려고 할 때마다 이메일 클라이언트가 자동으로 종료됩니다 !!”해당 종료 상태가 아무리 깨끗하더라도 여전히 잘못되었습니다.)
Donal Fellows

2

예외는 오류 처리기에서 오류 위치를 분할하여 최신 오류 처리를 허용합니다. 때때로 이것은 흐름 제어에도 사용됩니다.

처리되지 않은 예외는 프로그램을 종료합니다. 그러나 이것들은 이전의 예외와 다르지 않으며, 모든 경로에 적절한 오류 처리기를 포함하는 것을 잊어 버린 게으른 프로그래머 만 최종 사용자에게 표시됩니다. 예외로 인해 종료 된 프로그램이 다른 예기치 않은 끝과 동일하게 충돌 한 것으로 간주합니다.

OS는 충돌 방식에 관계없이 충돌 한 프로세스를 정리하는 데 매우 적합하므로 예외로 인해 오작동 프로세스를 종료하고 리소스를 해제하는 것 외에 다른 방법으로 OS에 안전을 추가하지 않습니다.


운영 체제 정리에 제한이 있습니다. 일반적으로 OS는 영구 리소스 (예 : 파일)를 정리 또는 롤백해야하는지 여부를 알 수 없으며 단순히 로컬 측의 연결을 닫는 것 외에 원격 연결에 정리가 필요한지 알 수 없습니다.
8bittree

2

매우 간단합니다.

  • 전체 시스템이 아닌 프로그램 만 충돌시키기 위해 [좋은] 운영 체제가 있습니다.
  • 치명적인 오류를 무시하는 대신 프로그램을 중단하려면 예외가 있습니다.

예외가 발명되기 전에 모든 함수는 종료 코드 (오류 / 성공)를 반환해야 했으며 함수에 설정된 포인터를 전달하여 함수의 결과 또는 출력 을 검색해야했습니다.

문제는 많은 프로그래머가 모든 단일 기능에 대해 잘못된 종료 코드를 확인하는 것을 기억하지 못하고 치명적이므로 치명적 오류가 무시되어 매우 설명 할 수없는 동작이 발생한다는 것입니다.

따라서 결정되었습니다-고려하지 않은 오류가 발생하면 즉시 충돌합니다! 일명 예외 처리.


1

예외는 단순히 오류 감지 메커니즘입니다. 그들 스스로는 아무 소용이 없습니다.

그러나 오류를 감지하면 오류가없는 상태 (이전 상태 또는 새로운 상태)로 전환하여 오류 상태에서 복구하기 위해 내결함성 메커니즘을 트리거 할 수 있습니다. 이렇게하면 오류가 시스템의 다른 부분으로 전파되지 않습니다.


0

예외 사항이 할 수있는 정상적인 프로그램의 흐름 분리 로부터 (프로그램이 할 수 있도록 설계되었습니다 무엇을) 오류 처리 흐름을 (어떻게 프로그램이 예외적 인 상황에서 복구하기 위해 노력하고있다).

이를 통해 코드를보다 명확하고 유지 관리하기가 쉽습니다.

두 개의 코드 스 니펫을 고려하십시오.

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
}

그러나 이것이 현대 프로그래밍 언어에서 예외가 된 이유는 아닙니다.

당신은 또한 사용할 수 있습니다 whilebreak대신 if그러나 이것은 것이 아니다 whilebreak에 대한 것입니다.


실제로 "비정상적인"제어 흐름을 처리하는 것은 goto와 그 친구 휴식이 가장 유용 할 때 정확 합니다. 예외의 장점은 함수 경계를 넘을 수 있고 호출자가 가장 적합한 위치를 결정할 수 있다는 것입니다.
hugomg

@hugomg : 예외의 또 다른 큰 장점은 예외가 발생한 장소와 처리 된 장소 사이에서 자원 정리 및 기타 작업을 수행 할 수 있다는 것입니다.
supercat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.