닷넷의 의미 : catch의 매개 변수로 예외가없는 try-catch 블록?닷넷에서 의미하는 것은 무엇입니까? catch의 매개 변수로 예외가없는 try-catch 블록?
답변
즉, catch 블록이 이면 어떤 것입니까? 예외입니다.
또한 예외 개체에 대한 참조가 없으므로 예외 개체를 사용하여 작업을 수행 할 수 없음을 의미합니다.
아무런 예외가 발생하지 않도록 신경 쓰지 않고 (아무 것도하지 않으려는 경우)이 패턴을 사용할 수 있지만 일반적으로이 스타일은 피해야합니다.
잡을 수있는 모든 예외를 포착합니다. 그것은 대개 나쁜 생각입니다.
모든 예외를 catch하지만 catch 블록의 예외 객체에는 액세스 할 수 없습니다.
이것은 다시 던지기 전에 오류에 대해 어떤 조치를 취하는 데 유용 할 수 있습니다.
.NET의 모든 예외는 Exception
클래스에서 파생되므로 관리되지 않는 호출을 사용하지 않는 경우는 거의 동일합니다. catch (Exception ex)
catch
블록에 Exception
의 인스턴스가 필요하지 않은 경우에 사용됩니다. 그러나 이없는 catch
이 매개 변수로 사용되는 경우 관리되지 않는 예외도 catch합니다. 다른 관리되지 않는 언어의 예외는 Exception
클래스에서 파생되지 않을 수 있기 때문입니다.
에 예외없이 catch 절을 사용할 수 있지만 모든 형식의 예외를 catch하는 경우,이 사용법은 권장되지 않습니다. 일반적으로 복구하는 방법을 알고있는 예외 만 잡아야합니다. 따라서 System .. ::. Exception에서 파생 된 개체 인수를 지정해야합니다. 예외 :
모든 예외를 catch하고 예외 인스턴스 자체에 대한 액세스 권한이 없습니다. 나에게, 보통 코드 냄새처럼 보인다 어떤 난 항상 VB에서 On Error Resume Next
문이 비슷한을 고려
(이것은 확인 간주 될 수있는 몇 가지 뛰어난가지 경우가있다).
두 가지 유형의 예외가 있습니다. CLS 규격, Exception 클래스에서 파생되고 CLS 규격과 다르다 (어떤 객체도 Throw 할 수있는 경우 - Int32, DateTime 등). catch
절은 예외없이 .net 프레임 워크 2.0이 아닌 CLS 규격 예외를 잡기 위해 사용되었지만 이제는 던져진 객체를 가리키는 WrappedException
속성을 사용하여 RuntimeWrappedException
에 잡아 포장됩니다. 그렇기 때문에 새 버전의 프레임 워크에서는 이러한 코드를 피해야합니다.
우선, 약간의 서문입니다. 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 판이 판매 중입니다)에 대한 자세한 내용을 알아보십시오.
즉, CLS가 아닌 예외를 catch하려고합니다.
는 지금까지 내 이해가 비 CLS 규격 예외가 발생하는 CLR의 버전 2.0에서, 이동 한, CLR은 자동으로 RuntimeWrapped- 예외 클래스의 인스턴스를 생성하고 참조하기 위해 개인 필드를 초기화 실제로 던져진 물건에. 사실상 CLR은 CLS가 아닌 모든 예외를 CLS 호환 예외로 변환합니다.
'이 기능은 다시 던지기 전에 오류에 대한 조치를 취하는 데 유용 할 수 있습니다.' '마침내'무엇을합니까? 어떤 예외도 방해하지 않지만 어쨌든 어떤 처리를 할 수 있습니다. – Joren
@ 조렌 : 그는 오류 상태에서 뭔가를 다루는 것과 같은 의미입니다. 예 : 다중 스레드 환경에있는 경우 오류가 발생했기 때문에 다른 스레드가 멈추도록 신호를 보낼 수 있습니다. 마침내 그렇게하기를 원하지 않을 것입니다. – Ian
@Joren : @Ian has it : 오류시 조치가 있지만 정상 반환은 아닙니다. – Richard