2011-11-11 4 views
7

새로운 예외 유형을 도입 할 때 나는 이것을 올바르게 수행하는 방법을 항상 모릅니다. 공통된 규정이 있습니까? 어떻게 할 수 있니?예외를 어떻게 명명하고 구성합니까?

난 당신이 또한 이름에 영향을

(구성 요소 수준? 패키지 수준? 응용 프로그램?에 유닛을 가지고 자신들이? 사용되는 장치에 보관)을 구성 범위에 관심이 있어요. 얼마나 컨텍스트를 포함합니까? EPersonIDNotFoundError와 같이 매우 구체적으로 작성하거나 ENOTFoundError와 같이 재사용 가능하도록 만드는 것이 좋습니다.

접미사 '오류'는 언제 추가해야합니까? 언제 추가해야하나요? 예를 들어 논리를 볼 수 없습니다. Classes.pas에서 :

EWriteError = class(EFilerError); 
    EClassNotFound = class(EFilerError); 
    EResNotFound = class(Exception); 
+0

심각도 및 패키지별로 예외를 구성하는 것이 좋습니다. 심각도 예. 데이터로드/저장 오류로부터 검증 예외를 분리합니다. 예외 인스턴스에는 일어난 사건에 대한 자세한 세부 정보가 포함될 수 있습니다. – too

+1

이것은 질문이 아닙니다 ... 한 번에 너무 많은 질문을 던지고 몇 가지 논쟁의 여지가 있습니다 (제물 낚시?). IMHO 이것은 SO 목적에 잘 맞지 않습니다. –

+0

@Arnaud 글쎄,이 대답을 시도하자. 나는 정말로 그 의견에 감사한다. –

답변

6

내가 아는 유일한 규칙은, E로 접두사입니다. 나는 과거에 많은 생각을하지 못했지만 지금은 생각해 보면 ErrorException이 일반적으로 후위로 사용됩니다. 당신이 그것들을 섞으면, 예기치 않게 오류가있는 연결, 깨진 연결, 또는 읽을 수없는 것으로 밝혀진 파일과 관련된 오류, 오류가 잘못된 입력과 더 관련이있다는 것, 예를 들어 숫자가 더 많았다 고 말하면, Exception은 예상했지만 누군가 텍스트를 입력했습니다.

대,시 EVariantError

VCL 너무 특정 규칙을 따라야 할 것 같다,하지만 그것을하지 않고 명확하고 오류가 없을 것입니다 경우에만 예를 들어,

EConvertError, EMathError가를 후위를 추가 할 것

EAccessViolation, EInvalidPointer, EZeroDivide

제리스트가 특정 공정 또는 엔티티에 오류를 나타내는 접미사 필요한 오류 자체를 설명 후자.

이 예제는 SysUtils에서 찾을 수 있습니다. 많은 예외 클래스뿐만 아니라 훨씬 많은 예외를위한 기본 클래스가 포함되어 있으므로 여기에서 살펴볼 수 있습니다. EHeapException과 ESafecallException과 같이 실제로 만나지 않기를 바라는 일부 매우 구체적인 오류를 제외하고는 Exception에 끝나는 것이 거의 없습니다.

+0

오류 메시지 자체가 오류 상태를 잘 전달할 때 "오류"를 건너 뛰는 것이 좋은 점입니다. 당신은 "예외"와 "오류"를 혼합합니까? –

+1

나는 "오류"를 거의 사용하지 않지만, 지금부터는이 질문이 생각 나게하기 때문에. 하지만 일반적으로 많은 예외 유형을 도입하지는 않습니다. 필자는 몇 가지 기본 응용 프로그램 수준 예외를 만드는 경향이 있으며 많은 기존 예외를 사용합니다. 어떤 값을 변환하는 데 실패하면 EConvertError를 사용하여 기쁘게 생각합니다. 내 자신의 목록/배열/컬렉션 구현은 EListIndexError를 호출 한 모든 항목을 쉽게 다시 사용할 수 있습니다. 나는 확실히 발견되지 않는 각 필드에 대해 별도의 예외를 생성하지는 않습니다. – GolezTrol

1

새로운 예외를 만들 때 나는 응용 프로그램을 광범위하게 만듭니다. 나는 가장 상세한 오류에서부터 가장 일반적인 것에 이르기까지 클래스 (Exception)처럼 시작하고 그에 따라 이름을 짓는다.

예를 들어, EPersonIDNotFoundError, ENotFoundError, Exception을 사용합니다.

은 정말 당신이 당신의 오류 메시지에서 원하는 얼마나 많은 세부 사항에 따라 어떤 간단한 애플리케이션에 일반적으로

1

(당신이 오류의 로그를 유지하는 경우) 당신이 당신의 로그에 포함 당신은 (Exception.Create 멀리 얻을 수 있습니다 '에러 메시지'). 예외가 강력 해지면 클래스를 보는 데 필요한 응답의 종류를 감지 할 수 있습니다. 델파이는 이미 EAbort를 발생시키는 Abort 절차에 의해 이것을 수행합니다. EAbort는 '오류'를 유발하지 않는다는 점에서 '특별'합니다. 즉 일종의 '침묵'예외입니다. 이 클래스 별 조치를 사용하여 예외를 검사하고 다른 작업을 수행 할 수 있습니다. EMyWarning, EMyVeryNastyError 등을 생성 할 수 있습니다. 각각 기본 Exception 유형의 자손입니다.

또한 예외가 트랩되는 지점까지 더 많은 정보를 전달할 수 있도록 새 예외 클래스를 정의 할 수 있습니다. (안 검사) 코드로 예를 들면 :

EMyException = class(Exception) 
    constructor Create(const AErrorMessage : string; AErrorCode : integer); reintroduce; 
PUBLIC 
    ErrorCode : integer 
end; 

constructor EMyException.Create(const AErrorMessage : string; AErrorCode : integer); 
begin 
    inherited Create(AErrorMessage); 
    ErrorCode := AErrorCode; 
end; 

당신은 지금 당신이 예외를 발생시킬 때 'ErrorCode가'를 설정 할 수있는 가능성을 가지고 예외가 잡힐 때 당신은 그것을 사용할 수 있습니다. 예외는 꽤 강력합니다.

+0

질문에 대한 답변은 아니지만 처음부터 예외를 상속해야하는 이유를 보여주는 좋은 사례입니다. 그리고 나는 EAbort를 좋아합니다. :) 당신은 많은 것들을 중단시킬 수 있습니다. 예를 들어, OnBeforePost의 EAbort와 이와 유사한 중단을 유발하여 레코드 게시를 중단합니다. 복잡한 작업을 중단하는데도 많이 사용합니다. – GolezTrol

1

어떤 범위로 구성해야합니까?

가장 일반적인 예외에 부합하려고하는 전체 응용 프로그램에 대해 하나의 단위를 사용하십시오. 그 밖의 모든 것은 예외가 던져지는 유닛으로 들어갑니다. 다른 단위에서 이러한 예외가 필요한 경우 작업중인 하위 시스템에서 사용하는 공통 단위로 이동하십시오.

이름은 어떻게됩니까?

ENotFoundError과 같은 "일반"예외 중 하나 또는 두 가지 수준을 만들어보십시오. 응용 프로그램 전역 파일에 넣으십시오. 나중에 예외가 생겨서 모든 것을 바꿔야한다는 것을 알 수 없기 때문에 일반화하기에 너무 열심히 노력하지 마십시오. 단위 수준에서 글로벌 예외를 상속하는 특수 예외를 만듭니다.

"오류"후위는 어떻게됩니까?

생각해보십시오. Add it. 바보 같지 않으면.

+2

코드가 인터페이스를 많이 사용하는 경우 인터페이스를 선언하는 유닛에서 예외를 선언합니다. 즉, – mjn

+1

@mjn을 발생시키는 코드를 구현하는 것이 아닙니다. 그렇지 않으면 인터페이스의 사용자는 구현 자에 대한 종속성을 얻지 않고 예외 클래스에 대해 특정 검사를 수행 할 수 없습니다. –

관련 문제