2011-01-20 4 views
1

C++에서는 맨손으로 예외를 throw 할 수 있지만 C#에서는 Exception을 던져야합니다. C++에서 문자열을 던지는 것과 동일한 C#은 무엇입니까?C++/C# 예외 throwing

예를 들어, C++에서는 throw "something bad happened"을 사용할 수 있습니다. C#에서는 이것이 .....일까요?

+1

답변을 시도 할 수는 있지만 문자열을 던지는 것일뿐입니다. –

+0

귀하의 질문에 아무런 의미가 없습니다. – Divi

+0

C++에서 "throw"를 할 수 있습니까? 이것은 오류 ";"이며 C#과 동등한 것이 좋습니다. –

답변

6

질문은 아주 희미하지만 문제는 "C++에서는 문자열을 던질 수 있지만 C#는 무엇입니까?"

C#에서는 C++에서 수행하는 것과 비슷한 방식으로 예외를 발생시킵니다. 주요 차이점은 C#에서는 System.Exception에서 파생 된 클래스 만 throw 할 수 있지만 C++에서는 std::exception 또는 다른 예외 기반 클래스에서 파생 된 클래스 만 throw하는 것이 좋지만 모든 유형을 throw 할 수 있지만 일반 문자열은 표시하지 않습니다. C++에서).

C#으로 단지 System.Exception이 아니라는 것을 명심하십시오, 그러나 예외가 발생하는 가장 일반적인 이유를 설명하는 다양한 파생 클래스의 봐서 거기 (ArgumentOutOfRangeExceptionInvalidOperationExceptionOverflowException는 ... 그냥 무작위로 대답) 그리고이 방법을 사용하면 문제의 유형을 표현할 수있는 더 나은 방법을 얻을 수 있습니다 (유형은 catch 블록으로 구분할 수 있음). 그리고 사용자 정의 오류 문자열을 건설자. 이것은 단지 문자열을 던지는 것보다 훨씬 낫습니다. 왜냐하면 예외가 "012"를 최대치로 "버블 링"하여 더 많거나 적게 만 문제를 기록하고 종료 할 수 있다면 일반 System.Exception을 잡아서 여전히 로그를 표시하므로 잡을 수 있기 때문입니다 에러 문자열

이 방법은 C++에서도 가능하지만 미리 만들어진 파생 예외 (<stdexcept>)는 .NET Framework에서 제공하는 것보다 훨씬 적습니다.

또 다른 중요한 차이점은 (C++에서 제공됨) C++에서는 throw에서 오는 스택 해제가 모든 로컬 객체를 즉각적으로 (RAII이 빌드 된 개념) 파괴하고 C#에서는 파괴가 비 결정적임을 나타냅니다 그 (것)들을 가르키는 vars가 범위에서 나간 후에 어떤 순간에); 따라서 이러한 경우에는 즉시 풀어서 IDisposable 인터페이스를 구현하고 using 블록을 사용해야하는 클래스를 갖는 것이 중요합니다.

+0

왜 C#에 using 절을 추가하여 결정적으로 파기 (또는 삭제)하게했는지 그 이유가 있습니다. –

+0

C++에서 C# 코드로 변환 할 때 원시 타입을 던지기위한 가장 편리한 대체품은 무엇입니까? – lexeme

+0

강력하게 형식화 된 예외를 throw하는 방법에 대해 조금 추가하고 System.Exception을 절대로 throw하지 않으면 +1을 얻을 수 있습니다. – Neil

1

C#에서는 Exception 클래스에서 파생 된 개체 만 throw 할 수 있습니다. CLR 자체는 다른 유형도 허용하므로 실제로 원하는 경우 다른 언어 또는 IL에서 직접 문자열을 throw하는 메소드를 작성할 수 있어야합니다. C#에서는 문자열 예외로 catch 할 수 없습니다 (예외 유형이없는 "catch"가있는 알 수없는 예외로만).

목표에 따라 throw new Exception("My string here");이면 충분할 수 있습니다. EDIT (Neil에게 감사드립니다.) 그러나 실험을 한 번 치우지 않는 한 자신 만의 예외를 만들어야합니다.

+2

-1 아니요 아니요 아니요. http://msdn.microsoft.com/en-us/library/ms173163.aspx System.Exception을 throw하지 마십시오. 호출 코드가 실패를 알 수 있도록 예외를 throw하고 일반 예외를 throw하면 코드에서 발생할 수있는 여러 가지 문제를 처리 할 수 ​​없습니다. – Neil