Re : 사용자 정의 예외 설계 : 기본 생성자를 구현해야합니까? "내부 예외"생성자?

StackOverflow https://stackoverflow.com/questions/1068103

문제

답변 예외를 직렬화 할 수있는 올바른 방법은 무엇입니까? 사용자 정의 예외를위한 "올바른"기본 구현에는 4 개의 CTORS가 포함되어 있습니다.

[Serializable]
public class SerializableExceptionWithoutCustomProperties : Exception
{
    public SerializableExceptionWithoutCustomProperties()
    {
    }

    public SerializableExceptionWithoutCustomProperties(string message) 
        : base(message)
    {
    }

    public SerializableExceptionWithoutCustomProperties(string message, Exception innerException) 
        : base(message, innerException)
    {
    }

    // Without this constructor, deserialization will fail
    protected SerializableExceptionWithoutCustomProperties(SerializationInfo info, StreamingContext context) 
        : base(info, context)
    {
    }
}

박쥐에서 바로, 나는 그것이 예외 유형의 정말 나쁜 이름이라고 말하고 싶습니다. 그러나 그 이상으로

  1. 이진 직렬화 목적으로, SO 질문이 언급 한 것입니다. 4 개의 생성자를 모두 구현해야합니다? [Serializable]의 목적 상, System.Exception에서 파생되기 때문에 2 개의 Args (SerializationInfo, StreamingContext)를 수용하는 CTOR를 제공해야합니다. 나는 그것을 이해할 수있다. 그러나 다른 CTOR를 구현해야합니다. 직렬화 가능한 예외를 올바르게 제공하기 위해? 유형을 XML-Serializable로 허용하려면 기본 (NO-OP) CTOR를 제공해야한다는 것을 알고 있습니다. [SERIALIZABLE]에 대해서도 마찬가지입니까? 잠시 동안, [시리얼 리화 가능]의 좁은 관심사에 자신을 제한하고 "프레임 워크 설계"에 관한 광범위한 지침을 제외하고 봅시다.

  2. 더 넓은 질문으로 이동 : 가이드 라인은 말합니다 저것 사용자 정의 예외는 4 개의 공통 CTOR를 구현해야합니다. 이 가이드 라인의 추론은 무엇입니까? 사용자 정의 예외를 설계하는 경우 Null/Default CTOR를 제공하지 않으면 정말 나쁜 태도입니까, 아니면 버그입니까? innerexception을 허용하는 CTOR를 제공하지 않으면 정말 나쁜 태도입니까, 심지어 버그입니까? 왜요? 내 사용자 지정 예외가 내 라이브러리 코드 내에서 생성 된 경우를 고려하고 내가 던질 수있는 유일한 사례에는 메시지가 포함되어 있으며 Innerexception이 포함되지 않습니다.

  3. 요컨대, 추가 속성을 제공하지 않는 사용자 정의 예외에 대해 다음 코드가 허용됩니까?


[Serializable]
public class CustomException : Exception
{
    public CustomException(string message) : base(message) { }

    // Without this constructor, deserialization will fail
    protected CustomException(SerializationInfo info, StreamingContext context) 
        : base(info, context) { }
}

또한보십시오: Winterdom Blog : 예외를 일련화 할 수 있습니다.

도움이 되었습니까?

해결책 4

나는 어떤 답을 좋아하지 않았다. 나는 제안 된 솔루션을 정착하고 있습니다. 또한 크로스 아파트 호출로 인해 직렬화가 작동하는지 확인해야합니다.

다른 팁

관련 코드 분석 경고는 CA1032입니다. 참조 페이지 이 정당화를 제공합니다.

전체 생성자 세트를 제공하지 않으면 예외를 올바르게 처리하기가 어려울 수 있습니다. 예를 들어, 서명 NewException (String, Exception)이있는 생성자는 다른 예외로 인한 예외를 생성하는 데 사용됩니다. 이 생성자가 없으면 내부 (중첩) 예외가 포함 된 사용자 정의 예외 인스턴스를 작성하고 던질 수 없습니다. 이는 관리 코드가 그러한 상황에서 수행 해야하는 일입니다. 처음 세 예외 생성자는 컨벤션에 의해 공개됩니다. 네 번째 생성자는 인터알되지 않은 클래스로 보호되며 봉인 된 클래스에서는 개인이 보호됩니다.

귀하 또는 귀하의 프로젝트 팀 만 귀하의 상황이 예외를 보증하는지 결정할 수 있습니다 (죄송합니다 ...)

이봐, 나는 그것이 적어도 Microsoft에 의해 조언을 받고 있다는 것을 안다. vs2008 (또는 이전 버전)을 사용하는 경우 Visual Studio가 입력하여 쉽게 만들 수 있습니다.

exception

편집기 및 누르기 탭 (두 번?)에서. 이로 인해 클래스에 새로운 이름을 줄 수있는 기회를 제공합니다.

제안 : 다른 사람들이 당신의 예외를 사용하고 다른 사람들이 .NET 예외에 익숙하기 때문에 가이드 라인을 따르지 않겠습니까? .NET 프레임 워크에서 사용하는 것과 동일합니다.

당신이 정의하는 사용자 정의 예외 유형의 수를 감안할 때 이것이 너무 많은 일이라고 생각하십니까? 그렇다면 이것은 지침을 따르는 또 다른 이유이며, 이는 많은 사용자 정의 예외를 만들어서는 안된다고 지정합니다.

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