문제

예외 처리에 대한 두 가지 접근 방식을 알고 있습니다. 한 번 살펴 보겠습니다.

  1. 계약 접근법.

    메서드가 메소드 헤더에서 수행 할 작업을 수행하지 않으면 예외가 발생합니다. 따라서 메서드는 작업을 수행 할 것이라고 "약속"하고 어떤 이유로 실패하면 예외를 throw합니다.

  2. 뛰어난 접근 방식.

    정말 이상한 일이 발생할 때만 예외를 던집니다. 정상적인 제어 흐름 (If 문)으로 상황을 해결할 수있는 경우 예외를 사용하면 안됩니다. 계약 방식 에서처럼 제어 흐름에 예외를 사용하지 않습니다.

    다른 경우에 두 가지 접근 방식을 모두 사용할 수 있습니다.

    OrderProduct라는 메서드가있는 Customer 클래스가 있습니다.

    계약 방식 : 라코 디스

    예외적 인 접근 방식 : 라코 디스

    여기에서는 고객이 복권에 당첨되지 않았다고 가정 할 때 돈이 없다는 것이 정말 예외적이지 않기 때문에 예외적 인 접근 방식을 선호합니다.

    하지만 여기에 제가 계약 스타일에서 잘못한 상황이 있습니다.

    예외 : 라코 디스

    CreateCar라는 메서드를 호출 할 때 엉뚱한 널 포인터 대신 Car 인스턴스를 기대합니다. 이로 인해 실행중인 코드가 12 줄 후에 손상 될 수 있습니다. 따라서 나는 이것보다 계약을 선호합니다 : 라코 디스

    어떤 스타일을 사용하십니까? 예외에 대한 가장 일반적인 접근 방식은 무엇이라고 생각하십니까?

도움이 되었습니까?

해결책

'계약'접근 방식을 선호합니다.예외를 지원하는 언어에서는 오류를 나타 내기 위해 null 또는 기타 특수 값을 반환 할 필요가 없습니다."if (result== NULL)"또는 "if (result== -1)"절이 매우 간단하고 직관적 인 논리와 혼합되어 있지 않으면 코드를 훨씬 쉽게 이해할 수 있습니다.

다른 팁

일반적인 접근 방식은 계약을 사용하여 "클라이언트"호출로 인한 모든 종류의 오류, 즉 외부 오류 (예 : ArgumentNullException)로 인한 오류를 처리하는 것입니다.

인수에 대한 모든 오류는 처리되지 않습니다.예외가 발생하고 "클라이언트"가 처리를 담당합니다.반면에 내부 오류의 경우 항상 오류를 수정하고 (어떤 이유로 데이터베이스 연결을 얻을 수없는 것처럼) 처리 할 수없는 경우에만 예외를 다시 발생시킵니다.

이러한 수준에서 처리되지 않은 대부분의 예외는 어쨌든 클라이언트에서 처리 할 수 없으므로 가장 일반적인 예외 처리기로 이동하므로 이러한 예외가 발생하면 아마도어쨌든 FUBAR.

외부 프로그램에서 사용할 (또는 다른 프로그램에서 재사용 할) 클래스를 구축하는 경우 계약 방식을 사용해야한다고 생각합니다.이에 대한 좋은 예는 모든 종류의 API입니다.

실제로 예외에 관심이 있고이를 사용하여 강력한 시스템을 구축하는 방법에 대해 생각하고 싶다면 소프트웨어 오류가있는 경우 안정적인 분산 시스템 만들기

두 접근 방식 모두 옳습니다. 이것이 의미하는 바는 예외를 던질 필요가없는 행동을 진정으로 예외적이지 않은 모든 경우에 지정하는 방식으로 계약을 작성해야한다는 것입니다.

코드 호출자가 기대하는 바에 따라 일부 상황이 예외적 일 수도 있고 그렇지 않을 수도 있습니다. 호출자가 사전에 특정 항목이 포함될 것으로 예상하고 해당 항목이 없으면 심각한 문제가 있음을 나타내는 경우 항목을 찾지 못하는 것은 예외적 인 조건이며 예외가 throw됩니다. 그러나 호출자가 항목이 있는지 실제로 알지 못하고 항목의 존재 또는 부재를 처리 할 준비가 똑같이 준비되어있는 경우 항목의 부재는 예상 조건이되며 예외가 발생해서는 안됩니다. 호출자 기대의 이러한 변화를 처리하는 가장 좋은 방법은 계약에서 DoSomething 메서드와 TryDoSomething 메서드, 예를 들어 의 두 가지 메서드를 지정하는 것입니다. 라코 디스

표준 'try'패턴은 위에 설명 된 것과 같지만 항목을 생성하는 인터페이스를 디자인하는 경우 몇 가지 대안이 도움이 될 수도 있습니다. 라코 디스

인터페이스 내에서 일반적인 TryGetResult 패턴과 같은 것을 사용하면 결과 유형과 관련하여 인터페이스가 변하지 않습니다. 위의 패턴 중 하나를 사용하면 인터페이스가 결과 유형과 관련하여 공변 할 수 있습니다. 또한 결과를 'var'선언에 사용할 수 있습니다. 라코 디스

표준 접근 방식은 아니지만 경우에 따라 장점이이를 정당화 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top