2010-02-18 3 views

답변

4

즉, catch 블록이 이면 어떤 것입니까? 예외입니다.

또한 예외 개체에 대한 참조가 없으므로 예외 개체를 사용하여 작업을 수행 할 수 없음을 의미합니다.

아무런 예외가 발생하지 않도록 신경 쓰지 않고 (아무 것도하지 않으려는 경우)이 패턴을 사용할 수 있지만 일반적으로이 스타일은 피해야합니다.

2

잡을 수있는 모든 예외를 포착합니다. 그것은 대개 나쁜 생각입니다.

1

모든 예외를 catch하지만 catch 블록의 예외 객체에는 액세스 할 수 없습니다.

이것은 다시 던지기 전에 오류에 대해 어떤 조치를 취하는 데 유용 할 수 있습니다.

+0

'이 기능은 다시 던지기 전에 오류에 대한 조치를 취하는 데 유용 할 수 있습니다.' '마침내'무엇을합니까? 어떤 예외도 방해하지 않지만 어쨌든 어떤 처리를 할 수 있습니다. – Joren

+0

@ 조렌 : 그는 오류 상태에서 뭔가를 다루는 것과 같은 의미입니다. 예 : 다중 스레드 환경에있는 경우 오류가 발생했기 때문에 다른 스레드가 멈추도록 신호를 보낼 수 있습니다. 마침내 그렇게하기를 원하지 않을 것입니다. – Ian

+0

@Joren : @Ian has it : 오류시 조치가 있지만 정상 반환은 아닙니다. – Richard

10

.NET의 모든 예외는 Exception 클래스에서 파생되므로 관리되지 않는 호출을 사용하지 않는 경우는 거의 동일합니다. catch (Exception ex)catch 블록에 Exception의 인스턴스가 필요하지 않은 경우에 사용됩니다. 그러나 이없는 catch이 매개 변수로 사용되는 경우 관리되지 않는 예외도 catch합니다. 다른 관리되지 않는 언어의 예외는 Exception 클래스에서 파생되지 않을 수 있기 때문입니다.

0

에 예외없이 catch 절을 사용할 수 있지만 모든 형식의 예외를 catch하는 경우,이 사용법은 권장되지 않습니다. 일반적으로 복구하는 방법을 알고있는 예외 만 잡아야합니다. 따라서 System .. ::. Exception에서 파생 된 개체 인수를 지정해야합니다. 예외 :

0

모든 예외를 catch하고 예외 인스턴스 자체에 대한 액세스 권한이 없습니다. 나에게, 보통 코드 냄새처럼 보인다 어떤 난 항상 VB에서 On Error Resume Next 문이 비슷한을 고려

(이것은 확인 간주 될 수있는 몇 가지 뛰어난가지 경우가있다).

1

두 가지 유형의 예외가 있습니다. CLS 규격, Exception 클래스에서 파생되고 CLS 규격과 다르다 (어떤 객체도 Throw 할 수있는 경우 - Int32, DateTime 등). catch 절은 예외없이 .net 프레임 워크 2.0이 아닌 CLS 규격 예외를 잡기 위해 사용되었지만 이제는 던져진 객체를 가리키는 WrappedException 속성을 사용하여 RuntimeWrappedException에 잡아 포장됩니다. 그렇기 때문에 새 버전의 프레임 워크에서는 이러한 코드를 피해야합니다.

1

우선, 약간의 서문입니다. CLR을 사용하면 모든 유형의 인스턴스를 예외로 throw 할 수 있습니다. 예를 들어, System.String 또는 심지어 System.Windows.Forms.Form 객체를 던질 수 있습니다. 그러나 C# 컴파일러는 Exception에서 파생 된 객체 만 throw 할 수 있습니다. 따라서 CLS가 아닌 예외를 잡는 유일한 방법은 코드에 빈 catch() 블록을 넣는 것입니다.

CLR이 비어 있지 않은 캐치 블록 (예 : catch (Exception ...))의 버전 2.0 이전에는 CLS 규격 예외 만 잡았습니다. 하지만 버전 2.CLR 중 0이면 Microsoft에서는 RuntimeWrappedException 클래스를 새로 도입하여 CLS가 아닌 예외가 throw되면 (예 : 다른 언어에서) CLR은 RuntimeWrappedException 클래스의 인스턴스를 자동으로 구성합니다. 그 이후로는 catch (Exception)모두 예외를 캐치 할 것이므로 빈 catch 블록 (즉, catch())을 가질 필요가 없습니다.

희망 사항.

자세한 내용은 제프리 리히터 (Jefrey Richter)의 훌륭한 책 "CLR via C#"(제 3 판이 판매 중입니다)에 대한 자세한 내용을 알아보십시오.

4

즉, CLS가 아닌 예외를 catch하려고합니다.

는 지금까지 내 이해가 비 CLS 규격 예외가 발생하는 CLR의 버전 2.0에서, 이동 한, CLR은 자동으로 RuntimeWrapped- 예외 클래스의 인스턴스를 생성하고 참조하기 위해 개인 필드를 초기화 실제로 던져진 물건에. 사실상 CLR은 CLS가 아닌 모든 예외를 CLS 호환 예외로 변환합니다.