.NET에서 ApplicationException은 무엇입니까?


172

예외를 발생시키기 위해 보통 내장 예외 클래스 (예 : ArgumentNullException및)를 사용 NotSupportedException합니다. 그러나 때로는 사용자 정의 예외를 사용해야 하며이 경우 다음과 같이 씁니다.

class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }

등등. 그런 다음 코드에서 던지고 잡습니다. 그러나 오늘 ApplicationException수업을 들었습니다. 대신 사용해야합니까? 그게 뭐야?

다른 이름을 가진 효과적으로 동일한 예외 클래스를 많이 갖는 것은 비효율적입니다 (일반적으로 개별 기능이 필요하지 않습니다). 그러나 나는 일반을 잡고 ApplicationException오류가 무엇인지 확인하기 위해 추가 코드를 사용해야 한다는 생각을 싫어합니다 .

ApplicationException내 코드와 어디에 맞아야합니까?


35
훌륭한 질문, 영리하게 명명 된 샘플 예외에 대해서도 +1
Cody Gray

답변:


100

msdn 의 설명 에 따르면 :

공용 언어 런타임이 아닌 사용자 응용 프로그램은 ApplicationException 클래스에서 파생 된 사용자 지정 예외를 발생시킵니다. ApplicationException 클래스는 응용 프로그램에서 정의한 예외와 시스템에서 정의한 예외를 구분합니다.

자체 예외를 작성해야하는 애플리케이션을 설계하는 경우 Exception 클래스에서 사용자 정의 예외를 파생시키는 것이 좋습니다. 원래 사용자 정의 예외는 ApplicationException 클래스에서 파생되어야한다고 생각되었습니다. 그러나 실제로 이것은 중요한 가치를 추가하는 것으로 밝혀지지 않았습니다. 자세한 내용은 예외 처리 모범 사례를 참조하십시오.

에서 파생 시키십시오 Exception. 또한, 귀하의 사례에 대해 새 예외를 생성하는 데 문제가있는 것으로 보이지 않습니다. 프레임 워크에 이미 예외가있는 경우에는이를 사용하고 그렇지 않으면 직접 롤백하십시오.


9
그래서 그것은 ApplicationException쓸모없는 것처럼 보이며 단지 이전 버전과의 호환성 때문입니까?
Beatles1692

4.7.2 이상의 새로운 MSDN 설명서에는이 설명이 없습니다. qutoe 주셔서 감사합니다 : D
Alex

147

짧은 대답은 어디에도 없습니다.

그것은 과거의 유물이며 Microsoft가 개발자가 ApplicationException에서 모든 사용자 정의 예외를 상속하도록 의도했습니다. 얼마 지나지 않아 그들은 마음이 바뀌었고 기본 예외 클래스에서 사용자 지정 예외를 파생시켜야한다고 조언했습니다. MSDN에서 예외 처리대한 모범 사례를 참조하십시오 .

이에 대한 가장 널리 보급 된 이유 중 하나는 Jeffery Richter의 프레임 워크 디자인 지침 에서 발췌 한 것입니다 .

System.ApplicationException 은 .NET Framework의 일부가 아니어야하는 클래스입니다. 원래의 아이디어는 SystemException 에서 파생 된 클래스 는 CLR (또는 시스템) 자체에서 발생한 예외를 나타내지 만 CLR이 아닌 예외는 ApplicationException 에서 파생 된 것 입니다. 그러나 많은 예외 클래스가이 패턴을 따르지 않았습니다. 예를 들어, TargetInvocationException (CLR에서 발생)은 ApplicationException 에서 파생됩니다 . 따라서 ApplicationException 클래스는 모든 의미를 잃었습니다. 이 기본 클래스에서 파생 된 이유는 일부 코드가 기본 스택을 잡기 위해 호출 스택보다 높은 코드를 허용하기 때문입니다. 더 이상 모든 응용 프로그램 예외를 포착 할 수 없습니다.

그래서 당신은 그것을 가지고 있습니다. 집행 요약있는 ApplicationException이되지 않는 것입니다 유해한 그냥 쓸모 .


2
그 이유 를 아는 사람 이 있습니까? "프로그래머가 망쳐 놓은"예외가 아닌 앱 예외를 표시 할 수 있도록하는 것이 의미가있는 것 같습니다.
Josh Kodroff

9
BTW, 이것은이 설명에서 이것이 나쁜 디자인 그 자체는 아니지만 MSFT가 구현을 망친 것으로 보입니다. 다른 사람이 이것을 비슷하게 읽습니까?
Josh Kodroff

8
@ JoshKodroff : 문제는 응용 프로그램이 Whizbang일부 공통 계층 구조에서 모든 예외를 원한다고 결정하면 ApplicationException해당 목적으로 사용하면 실제로 사용자 지정 WhizbangException기본 클래스 를 사용하는 것보다 이점이 없다는 것 입니다. 그러나 .net의 예외 계층 구조에서 더 심각한 문제는와 관련이 없지만 ApplicationException예외를 아마도 응용 프로그램-치명적, 아마도 스레드-치명적 및 로컬 문제 관련 범주로 나누지 못하는 것입니다. 의미있는 "복합"예외.
supercat

@JoshKodroff : 적절하게 설계된 예외 프레임 워크에서 IMHO finally는 다른 예외가 보류중인 동안 차단 중에 예외가 catch발생하면 중첩 된 예외 와 일치 하는 경우 호출 스택을 추가로 트리거해야 하지만 다른 예외는 보류 중이므로 종료해야합니다. catch블록은 다른 진행할 것 catch같은 내 블록 try(임의의 적합한한다면) 블록, 및 종료 finally다음 외부로 이동할 것이다 보류 어떤 예외 블록 catch또는 finally.
supercat

2
@JoshKodroff 더 많은 주목을받지 않는 것이 놀랍습니다. "응용 프로그램"이란 무엇입니까? 타사 라이브러리는 어떻습니까? 이들은 .Net 프레임 워크의 일부가 아니므로 원래 지침에 따라 ApplicationException에서 상속해야합니다. 이제 응용 프로그램에서 해당 라이브러리를 사용하고 자체 ApplicationException을 만들면 더 이상 해당 라이브러리를 기반으로 라이브러리의 예외에서 자신의 예외를 식별 할 수 없습니다. 그래서 쓸모가 없습니다. 대신 supercat에 설명 된대로 각 구성 요소는 고유 한 예외 기본 유형을 정의해야합니다.
Oskar Berggren

22

.NET 1.0의 초기 디자인에서는 프레임 워크 자체가 발생 SystemException하여 파생 되도록 계획 되었습니다. 사용자 응용 프로그램-던지고 ApplicationException파생됩니다.

그러나 나중에 .NET 2.0에서는 삭제되었습니다.

따라서에서 파생됩니다 Exception.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.