2011-01-07 2 views
12

일반 프로그래밍에서 무엇이 더 좋고/더 빠르는지 알고 싶습니다. 예외를 피하거나 예외를 기다리시겠습니까?더 나은/빠른 무엇입니까? try-catch 또는 예외를 방지 하시겠습니까?

피를 제외하고는 다음과 같습니다 당신이 할 수있는 경우

string a = null; 
list = someMethod(); 
if(list.Length > 0){ 
    a = list[0]; 
} 
if(a!=null) ... 

또는 캐치 예외를 시도 ...

string a = null; 
try{ 
    a = someMethod()[0]; 
catch{} 
if(a!=null) ... 
+1

단어 "빠른"을 취소하십시오, 그것은 무의미합니다. 그리고 CLR을 사용하는 것이므로 try-catch를 사용하는 것은 올바른 방법이 아닙니다. – BoltClock

+0

그냥 예를 들어 ... – carlosdubusm

+1

@ BoltClock, 아니야. 예외가 발생하면 느리다. – CaffGeek

답변

18

여기에는 성능이 가장 중요한 관심사는 아닙니다. 문제는 더 읽기 쉽고 유지 보수 가능하며 테스트 할 수있는 프로그램으로 연결되는 것입니다. 나중에 성능에 대해 걱정할 수 있습니다.

일반적으로 흐름 제어에 예외를 사용하지 마십시오. 그들은 실제로 프로그램을 더 읽기 어렵게 만드는 비 국부적 인 goto입니다. 따라서 예외적 인 상황을 대비하여 예약해야합니다. 흐름 제어를 위해 try-catch 블럭을 사용하지 않고 빠져 나갈 수 있다면 그렇게하지 마십시오. 귀하의 프로그램은보다 읽기 쉽고 유지 보수가 용이합니다.

이 상황을 처리 할 수있는 "오른쪽"방법은 someMethod의 반환 값은 보장 계약 (Contract.Ensures)이 있으면

var list = someMethod(); 
if(list == null || list.Length == 0) { 
    // handle something bad 
} 
string a = list[0]; 
if(a != null) { 
    // go 
} 

당신은 list가 null과 비어 있지 아니라고 검사를 피할 수있다 null이 아니고 비어 있지 않습니다.

그러나 예외적으로 지역적으로 비용이 많이 듭니다. 프로그램의 성능에 영향을 주는지 (즉, 병목 현상인지) 여부는 다른 질문입니다. 그러나 적절히 사용하면 예외는 일반적으로 병목 현상이 아닙니다. 응용 프로그램이 충돌 할 때 성능에 신경을 쓴 사람은 누구입니까?

+0

그래, 대답 주셔서 감사합니다, 나는 뭔가 시도가 옳지 않아 빈 캐치 알았어. 더 많은 프로그램을 유지 보수하는 것은 매우 사실입니다. 예상하지 못한 다른 예외가 발생할 수 있으며 결코 알 수 없습니다. 어쩌면 빈 캐치는 어떤 예외가 발생해도 프로그램을 계속 실행하고 싶지 않은 경우 신경 쓸 일입니다. – carlosdubusm

+1

@carlosdumusm : 이걸 제대로 이해하고있는 것 같지만 모든 예외를 잡는 빈'catch' 블록이나'catch' 블록이 (즉, 기본 클래스'Exception'을 잡아냅니다) 나쁜 것, 나쁜 것, 나쁜. 던져 질 수있는 예외의 유형은 알 수 없지만 이제는 모든 예외를 처리 할 수 ​​있다고 선언하고 있습니다.일이 나쁜 상태에 있지만, 모든 예외를 "처리"하고 있기 때문에 나쁜 상태 또는 나쁜 상태가 무엇인지 알지 못하는 경우 아무 일도없는 것처럼 계속 진행하는 것이 잠재적으로 매우 위험합니다. 당신이 처리 할 수 ​​있다는 것을 알고 그렇지 않으면 빨리 실패하십시오. – jason

+0

그래, 이해가된다. 나는 몇 년 동안 프로그래밍을하고 있지만 예외에 대한 지식이 거의 없으며 때로는 어디에서 잡아라 던지 또는 던지기를 알지 못한다. 감사. – carlosdubusm

1

은 항상 항상 항상 예외를 피할 수 있습니다.

예외는 예외적이어야합니다.

예측할 수 있다면 문제가 발생하지 않도록하십시오. 그런 빈 catch 블록을 사용

사람들은

그것은 catch 블록에 가지도 빠르다 ... 컴퓨터를 사용 금지해야한다.

7

예외가 발생합니다. 예외를 테스트하고 피할 수 있으면 그렇게하십시오.

정상적인 프로그램 흐름에는 예외를 사용하지 않아야합니다.

+0

예, 예외 비용에 대해서는 생각하지 않았습니다. – carlosdubusm

0

던지기 예외는 값 비싼 작업이므로, 항상 잡으려고하지 않고 확인하려고합니다.

각 테스트를 통해 예외를 throw하는 일부 코드를 테스트하고 조건부 검사를 수행하고 성능을 측정하는 유사한 코드 집합에 대해 테스트하기에 충분히 쉽습니다.

코드에 예외 상황이 발생하는 세부 정보가 문서화되어 있으면 호출 코드를 적용 할 수 있어야합니다. 물론 모든 시나리오 (낮은 수준의 런타임 오류는 아마도?)를 처리 할 수 ​​없으므로 코드가 실제로 반응하고 가능한 계속 진행될 수있는 예외를 처리하고 처리해야합니다.

2

다릅니다. 그렇게하는 것이 비용이 많이 드는 경우가 아니면 예외를 피하려고합니다.

0

예외는 예외적 인 경우가 아니면 예외를 사용해야하므로 예외적 인 상황이 계속 될 경우에만 try/catch를 사용해야합니다 (오류 메시지 팝업).

try/catch는 프로그래머에게 외부 오류가 발생할 수 있으며 처리해야한다는 신호를줍니다. 귀하의 예제에서 list이 null은 단순히 프로그램 실행/제어 흐름의 정상적인 부분이므로 예외적 인 것은 없습니다.

또한 빈 캐치 올은 일반적으로 어쨌든 가지고있는 것은 좋지 않습니다 (필요한 경우는 제한적 임). 예외에 대해 아무 것도하지 않는 이유를 설명하기 위해 어쨌든 코멘트가 필요합니다.

당신은 모든 입력 길이마다 시간을 확인하고 있기 때문에 피해가 더 비싼, 골치 아픈의 예외에 대한 useful blog post 당신이 중요한 N 런타임을 통해 지침/성능 관점의 숫자에서

1

순수 유용 할 수있다 . 예외적으로, catch 브랜치는 그 결과에 대해서만 실행됩니다.

+3

그러나 그것이 일어날 때 SLOWER입니다. 다른 잠재적 인 오류를 숨 깁니다. 그리고 그것은 끔찍한 프로그래밍 습관입니다. – CaffGeek

+1

정상적인 흐름에서 Try-Catch는 오버 헤드가 전혀 발생하지 않습니까? 이 예제에서 사용 된 테스트 및 점프는 처리 시간 측면에서 매우 저렴합니다. – Derrick

+0

당신이 말했듯이, 다른 프로그래밍 오류를 숨기는 것은 빈'catch {}'일 때 그것은 끔찍한 프로그래밍 습관입니다. 언급 한 바와 같이, 예외는 일상적으로 발생하는 것이 아닌 예외적 인 조건에 사용되어야합니다 (예 : 목록이 항상 초기화시 null이 될 것이며 빈번히 히트 할 것으로 예상되는 경우 더 이상 예외가 아니므로 체크를 작성해야합니다 그것을 위해). – Aphex

2

물론 예외는 피하십시오.

관련 문제