2010-08-12 2 views
7

자동화를 사용하여 다른 프로그램을 제어하는 ​​C# 응용 프로그램을 작성하고 있습니다. 당연히 그 프로그램은 내 프로그램이 작동하도록 실행되어야합니다. 내 프로그램이 응용 프로그램을 찾고 찾을 수 없을 때 예외를 throw하고 싶습니다. (당연히 나중에 응용 프로그램을 열거 나 사용자에게 열어 보거나 ...).이 경우 어떤 유형의 예외를 발생합니까?

사용자 지정 예외를 구현해야합니까? 아니면 기존의 NotSupportedException (또는 다른 .NET 예외 중 하나)을 사용해야합니까? 사용자 정의 예외가 있다면 무엇을 제안하겠습니까? 나는 그것을 MyAppNameException이라고 부르는 사용자 정의 예외를 구현할 생각을하고 있었고 그 다음 문제를 선언하기 위해 메시지를 사용했다.

프로그램을 읽기 쉽고 사용하기 쉬운 방식으로 예외를 던지기위한 일반적인 규칙이 있습니까? 아니면 너무 많은 생각을하고 있습니까?

감사합니다.

답변

8
  1. 먼저 추상 기본 클래스로 MyAppCustomException을 정의하십시오.

  2. 그런 다음 AppNotFoundCustomException으로 상속합니다.

앱에서 모든 예외, 또는 단지 특정 사람을 잡을 수있는이 방법. 여기

은 개념 설명 몇 가지 예제 코드입니다 :

public abstract class MyAppCustomException : System.Exception 
{ 
    internal MyAppCustomException(string message) 
     : base(message) 
    { 
    } 

    internal MyAppCustomException(string message, System.Exception innerException) 
     : base(message,innerException) 
    {    
    } 
} 

public class AppNotFoundCustomException : MyAppCustomException 
{ 
    public AppNotFoundCustomException(): base("Could not find app") 
    { 
    } 
} 

을 그리고 여기에 클라이언트에게 try/catch 예입니다 :

try 
{ 
    // Do Stuff 
} 
catch(AppNotFoundCustomException) 
{ 
    // We know how to handle this 
} 
catch(MyAppCustomException) // base class 
{ 
    // we don't know how to handle this, but we know it's a problem with our app 
} 
+0

'System.Exception'에서 파생 된 경우 [권장되는 세 가지 일반 생성자를 구현하는 것이 좋습니다 (https://msdn.microsoft.com/en-us/library/87cdya3t%28v=vs.110%) 29.aspx). 즉, 질문에 설명 된 상황에서 예외를 throw하는 것이 최선의 방법이 아닐 수도 있습니다. @Hans Passant의 [대답] (http://stackoverflow.com/a/3471960/1497596)을 참조하십시오. – DavidRR

3

내가 사용하는 Framework Guidelines book 당신은 사용자 정의 예외를 만들 것을 나타냅니다 때 오류 조건은 기존의 예외와 다른 방식으로 프로그래밍 방식으로 처리 될 수 있습니다.

경우에 따라 백엔드 설치 프로그램을 시작하기 위해 사용자 지정 예외를 만들려는 경우는 고유하며 사용자 지정 예외는 괜찮을 것이라고 생각합니다.

그렇지 않으면 System.Runtime.InteropServices.ExternalException 계층 구조의 일부가 적절할 수 있습니다.

+0

+1 사용자 지정 예외로 처리하려는 경우 사용자 지정 예외 만 만들면됩니다. 당신이 설명한 상황에서 실제로 프로그래밍 적으로 뭔가를 할 수 있다면, 나는 Postman이 제안한 것과 함께 갈 것입니다. – jloubert

1

네, 당신은 그것을 과장하고 있습니다. 아무 예외도 발생시키지 않으면 아무 일도 일어나지 않을 것입니다. 예외적으로 프로그램이 마술처럼 행동하기 시작하는 것은 아닙니다. 실제로 예외를 잡아서 계속하려고하는 것처럼 나쁜 일만 생길 수 있습니다. 또는 아무도이를 잡아 내지 않고 Windows 오류보고 대화 상자를 가져올 수 없습니다. 메시지 상자를 놓고 Environment.Exit()으로 하루를 부를 수도 있습니다.

물론 프로그램을 실행하지 않으면 프로그램을 실제로 시작하면 사용자에게 더 유용 할 수 있습니다.

+0

+1 나는 정말로이 경우에 예외가 될 것이라는 점에 동의한다. 0 값입니다. – JonH

0

응용 프로그램이 문제의 메서드를 지원하기 때문에 NotSupportedException을 사용하면 안됩니다. NotSupportedException은 인터페이스 또는 추상 클래스가 구현되었지만 일부 멤버가 컨텍스트에서 이해할 수 없으므로 완전히 구현되지 않은 상태에서 사용됩니다 (출력 스트림에서 읽기, 읽기 전용 컬렉션 지우기 등).

근접 일치는 InvalidOperationException이며 멤버를 사용할 수 있지만 현재 상태는 제공되지 않습니다.

"응용 프로그램"이라고 말하면 구성 요소가 아닌 실행 파일을 제안합니다. 이 경우 호출 코드가 없으므로 예외를 호출 코드로 버블 링하지 않고 GUI 애플리케이션의 경우 대화 상자를 올리거나 콘솔 앱의 경우 Console.Error에 쓰십시오. 이렇게하면 예외의 Message 속성 값을 표시하거나 특정 메시지에 플래그를 지정하기위한 클래스 유형 만 필요하게됩니다. 단순히 Exception에서 AppNotRunningException을 파생 시키거나 Exception을 직접 사용하는 것이 가장 편리하다고 생각되는 두 가지 방법에 따라 완벽하게 잘 작동합니다.