2013-07-26 1 views
0

나는 예외 상황이 어디에서 파생되는지 이해하려고 시도하고있다. 내 질문은 끝이지만, 나는 그것을 더 명확하게 할 수있는 모범을 제시 할 것이다.예외가 기본입니까, 아니면 조건으로 대체 될 수 있습니까?


예를 들어,이 Java 코드를 사용하십시오. 그것에는 파일에 경로가 있고 File 목표를 설치했다. 패스가 null의 경우, 예외가 Throw됩니다.

String path = getPathName(); 
try { 
    File file = new File(path); 
} catch (NullPointerException e) { 
    // ... 
} 

이하지만, 거의 예외적 인 상황입니다, 우리는이보다 더 낫다 될 수있는 방법으로 수정할 수있는 경우 :

String path = getPathName(); 
if (path == null) { 
    path = DEFAULT_PATH; 
} 
File file = new File(path); # we've removed the need for an exception 

그러나 더 이상 이동하지, 우리는 새로운 예외 경우에 실행 우리는 시도하고 File 읽을 수 있도록합니다.

try { 
    file.setReadable(true); 
} catch (SecurityException e) { 
    // ... 
} 

우리는 두 가지 조건을 확인하여이 문제를 해결 치마 할 수 있습니다 내 질문에, 마음이 예제

SecurityManager sm = System.getSecurityManager(); 
if (sm != null && sm.checkWrite(path)) { 
    // modify the SecurityManager 
} else { 
    file.setReadable(true); 
} 

을 ...


우리가 아래로 이동하는 경우 stack, Java에서 OS로가는 등 if-else 브랜치로 모든 예외 처리 코드를 대체 할 수 있습니까? 아니면 프로그래밍에 "구워진"예외 (하드웨어)의 근본 원인이 있습니까?

+0

가까운 투표가 필요한 이유는 무엇입니까? – sdasdadas

+1

너무 넓은 옵션이 선택되어 있습니다. 그래서, 나는 이것이 너무 많은 답변을 가질 까봐 두려웠다 고 생각한다. – Marcin

+0

아, 나는 나 자신을 위해 투표하지 않고 추론을 볼 수 있다는 것을 몰랐다. – sdasdadas

답변

4

Java에서 OS로 이동하면 if-else 분기로 모든 예외 처리 코드를 바꿀 수 있습니까?

예. 이것은 이전에 사용되던 방식 이었지만 여전히 예외없이 언어로되어 있습니다. 예외는 여러 가지 감각에서 더 쉽기 때문에 사용됩니다. 주요 이점은 프로그래머가 예상하지 않은 경우를 일반 핸들러에서 집계 할 수 있다는 것입니다. 예외 상황에 대한 정보가 제대로 처리 될 때까지 모든 단일 기능에서 명시 적으로 보존 할 필요는 없습니다.

프로그래밍에 "구워진"것을 의미하는 예외 (하드웨어?)의 근본 원인이 있습니까?

예. 일반적으로 예기치 않은 하드웨어 조건은 사용자가 정의되지 않은 동작에 익숙하지 않은 한 어떤 방식 으로든 처리해야합니다.

+0

감사합니다. 내 질문에 대한 답변입니다. – sdasdadas

+0

@sdasdadas 환영합니다. – Marcin

0

모두 프로그램의 메소드가 일종의 "예외"객체에 대한 포인터/참조를 반환했습니다 (다른 반환 값의 경우 포인터 또는 호출자가 할당 한 저장 위치에 대한 참조를 전달 함). 가 직접 또는 간접적으로 예외를 throw 할 수 있습니다 모든 메소드에 호출은 같은과 함께 괄호했다 :

ret = callFunction(...parameters...); 
if (ret != NULL) 
    return AddToExceptionStacktrace(ret, ...info about this call site...); 

다음주의 (예외 처리의 다른 형태에 대한 필요가 없을 것 유형이 범위 서포트하고있는 경우, 그 변수를 반환하려면 "return"문을 사용하여 코드를 실제로 삭제하기 전에 코드를 삽입해야합니다. aller).

불행히도, 많은 추가 코드가 있습니다. 이 접근법은 "checked"예외 (즉, 예외를 throw하지 않고 선언하지 않는 한 메서드를 통과시킬 수 있음을 의미 함)가 있지만 직접 또는 간접적으로 모든 함수에 오버 헤드를 추가하는 언어로도 사용할 수 있습니다 예외를 던지는 함수를 호출하는 것은 매우 비쌉니다. 예외 처리 메커니즘은 일반적으로 예외없는 경우에는 추가 오버 헤드의 99 %를 제거하고 "예외"경우에는 오버 헤드가 증가합니다.

관련 문제