2014-10-16 2 views
2

다른 메서드 중 생성자 메서드가 들어있는 별도의 클래스 파일이 있는데이 클래스의 인스턴스를 Windows 폼 내에 만듭니다. 필요한 파일이 존재하지 않으면 FileNotFoundException으로 catch하는 경우 생성자 메서드 내에서 예외 처리를 수행해야합니다. 내 유일한 문제는 인수를 전달할 수 없거나 생성자 클래스의 데이터를 반환 할 수 없기 때문에 예외의 결과를 Windows 양식에 전달하는 방법을 알 수 없다는 것입니다.생성자 메서드에서 try-catch 예외 처리

+0

코드의 약식 버전을 포함 할 수 있습니까? 어쩌면 생성자 대신 정적 메서드를 사용합니다. 파일 읽기가 실패 할 경우 개체를 생성하고 싶지 않으면? –

답변

3

개념상의 실수를 저지르고 있습니다. 생성자는 인생에서 단 하나의 목적을 가지고 있습니다. 바쁜 평생 동안 클래스 인스턴스를 준비하는 것입니다. 따라서 가능한 결과는 2 가지뿐입니다.

  • 건설 성공. 개체를 사용할 수 있습니다.
  • 예외로 인해 구성이 중단 되었기 때문에 구성이 실패합니다.

당신이 언급 파일이 함수에 개체에 대한 중요한을 경우,이 예외를 catch하고 그냥가 인스에 외부 미끄러 못하게한다. 이 경우에는 '오류를 반환하고 객체를 반으로 사용할 수있는 상태로 두는 것이 바람직하지 않습니다. 양식의 이벤트 핸들러는 예외를 포착하여 사용자에게 전달해야합니다.

사용 가능한 개체가 여전히 반환 될 수있는 사용 사례가있는 경우 public static MyClass instantiateConditionally(string filename, out bool somethingHappenedAlongTheWay)과 같은 정적 메서드를 구현해야합니다. 이렇게하면 인스턴스를 계속 반환 할 수 있으며 잘못된 것을 반환 할 수 있습니다.

1

예외가 발생하더라도 개체를 성공적으로 생성해야합니까?

그렇다면 생성자에서 예외를 처리하지 마십시오. 객체를 생성하는 윈도우 폼 메서드에서 처리하십시오.

그렇다면 객체에서 생성자에서 예외가 처리 된 경우 true를 반환하는 부울 속성 HasErrors을 구현하는 것이 좋습니다. 처리 된 예외 (인스턴스 필드에 편리하게 저장 됨) 또는 null을 반환하는 메서드 GetErrors()도 구현합니다. 이 방법을 사용하면 객체 작성 중에 예외가 발생하여 그에 따라 작동하면 항상 윈도우 양식 메서드를 확인할 수 있습니다.

0

다음과 같은 것이 있습니까?

public class Form1 : Form 
{ 
    ... 


    public void button_Click(...) 
    { 
     try 
     { 
      var myclass = new MyClass(@"C:\...some file"); 
      ... 
     } 
     catch (FileNotFoundException) 
     { 
      MessageBox.Show("Can't find the file required"); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 
public class MyClass 
{ 
    public MyClass(string path) 
    { 
     if(string.IsNullOrEmpty(path)) 
      throw new ArgumentNullException(); 

     if(!File.Exists(path)) 
      throw new FileNotFoundException(); 
     ... 
    } 
} 

여기서는 사용자가 일부 버튼을 클릭 할 때 MyClass의 인스턴스를 만듭니다.

경로가 지정되지 않았거나 파일이 지정된 경로에서 발견되지 않으면 MyClass의 클래스 생성자가 예외를 throw합니다.

나는 try catch를 사용하여 던져진 예외를 잡아 내고 사용자에게 메시지 상자를 표시합니다.