2012-06-28 7 views
2

코드 컴플리트에서 플로우 컨트롤에 대한 예외를 사용하면 안된다는 것을 읽었습니다. 또한 일반적인 조언은 "예외적 인 경우"를 처리하기 위해 예외를 사용하는 것임을 알고 있습니다. 하지만이 조언을 어떻게 적용해야할지 모르겠습니다. 예외를 사용하여 생성자에서 잘못된 매개 변수를 확인하는 것이 좋습니다. 예를 들어 스프레드 시트의 행을 레코드 개체로 변환하는 ExcelInputConverter가 있습니다 (조작 용). 생성자는 Excel 파일의 이름을 입력으로 사용합니다. 들어오는 문자열이 유효한 Excel 파일인지 확인하기 위해 예외를 사용해야합니까? 엑셀 파일이 존재한다는 것입니까? 이 경우 예외를 사용해야하는 것처럼 보입니다. 클래스가 본질적으로 작동하지 않을 수 있기 때문입니다.예외를 사용하여 생성자에서 잘못된 매개 변수를 확인해야합니까?

클래스 또는 클래스 외부에서 유효하지 않은 데이터가 있는지 확인하는 것이 좋습니까?

Public Sub New(filename as string) 'new excel input converter 
     If Not (Path.GetExtension(fileName) = ".xls" Or Path.GetExtension(fileName) = ".xlsx") Then Throw New Exception("Can't make an Excel input converter from a non-Excel file like " & inputFileName) 
     If Not (File.Exists(fileName)) Then Throw New Exception("This file does not exist. Can't make an Excel converter") 
+0

실제로 생성자가 실패했다는 것을 프로그램에 알리는 방법은 없으므로 예외를 사용하면 올바른 방법 일뿐입니다. –

답변

3

생성자에 대한 잘못된 인수로 인해 개체를 작성할 수없는 경우 예외가 적절합니다. 대부분의 언어는 객체 작성자에게 무언가가 잘못되었다는 것을 알려주는 다른 방법을 제공하지 않습니다 (객체에 "유효하지 않은"플래그를 설정하는 것 외에는 제안하지 않습니다).

.NET에서는 이러한 유형의 상황에 대해 ArgumentException을 정의합니다.

클래스 또는 클래스 외부에서 유효하지 않은 데이터가 있는지 확인하는 것이 좋습니다.

클래스는 어떤 데이터가 유효한지 가장 잘 알고 있습니다. 클래스가 시간이 지남에 따라 발전하고 유효한 데이터가 변경되는 규칙이 있으면 해당 클래스를 사용하는 모든 코드를 변경하여 변경 사항을 반영하지 않아도됩니다.

0

나는 최후의 수단으로 예외를 사용하는 경향이 있습니다. 파일 검사 같은 것을 위해, 내가 할 : (PsuedoCode)

try 
{ 
    fileToCheck = getUserInput(); 
    while(!fileToCheck.Exists() && quit==false) 
    { 
     Console.WriteLine("File does not exist. Make sure the path and filename are correct."); 
     quit = getQuitInput(); 
     fileToCheck = getUserInput(); 
    } 
    // fopen(fileToCheck) and other processes. Include other sub-try/catch blocks as needed. 
} 
catch (Exception e) 
{ 
    Console.WriteLine("Fatal Error Occurred. Check Log files for information."); 
    logError(e); 
} 

이러한 방식으로, 사용자는 (발생할 수 있습니다 만 더 복잡한 경우가 해결할 수없는 자신의 사용자 오류 문제를 해결하기 위해 시도 할 수 있습니다 파일이 손상되거나 무언가를 얻습니다) 프로그램이 종료합니까

+0

사실 OP의 질문이 생성자에서 적절한 지 여부를 다루지는 않습니다 ... –

+0

일반적으로이 개념을 내 코드 전체에서 사용하므로 생성자가 입력 값에서 생성되는 경우 매개 변수 유효성 검사를 시도하기 전에 처음에는 생성자에 전달됩니다. 임의의 사용자 입력 유효성 검사 *가 생성자에서 발생해야하고 UI 범위에서 수행 할 필요가없는 경우 사용자에게 데이터를 다시 요청하는 것이 불가능할 수 있습니다 (예 : 잘못된 입력이있는 1000 개의 객체 만들기). 나아지 다 –

관련 문제