.NET : 필수 구성 설정이 누락 된 경우 어떤 예외가 발생합니까?


123

다음은 표준 시나리오입니다.

if(string.IsNullOrEmpty(Configuration.AppSettings["foobar"]))
   throw new SomeStandardException("Application not configured correctly, bozo.");

문제는 어떤 예외 SomeStandardException가되어야하는지 완전히 확실하지 않다는 것입니다.

나는 3.5 프레임 워크를 숙독하고 두 후보들을 발견 ConfigurationException하고 ConfigurationErrorsException.

System.Configuration.ConfigurationException

구성 시스템 오류가 발생했을 때 throw되는 예외입니다.

비고

ConfigurationException응용 프로그램을 시도 읽거나 구성 파일에 기록 데이터를하지만 실패 할 경우 예외가 발생합니다. 이에 대한 몇 가지 가능한 이유에는 구성 파일의 잘못된 XML, 파일 권한 문제 및 값이 유효하지 않은 구성 속성이 포함될 수 있습니다.

노트 :

ConfigurationException개체의 호환성을 유지한다. ConfigurationErrorsException 개체가 구성 시스템을 대체합니다.

이 예외는 실제로 내가 필요한 것에 완벽하게 들리지만 쓸모없는 것으로 표시되었으므로 atthay에 대해 ixnay.

이것은 우리를 완전히 혼란스럽게 만듭니다 ConfigurationErrorsException.

System.Configuration.ConfigurationErrorsException

현재 값이 EnableSessionState 값 중 하나가 아닙니다.

보시다시피 문서는 완전히 쓸모가 없습니다. (로컬 도움말과 온라인 도움말 모두에서 그렇습니다.) 수업 자체를 살펴보면 내가 원하는 것에 대해 과감한 과도 함을 알 수 있습니다.

간단히 말해 애플리케이션 구성 설정이 없거나 잘못된 값이 포함 된 경우 throw되어야하는 표준 예외가 필요합니다. 응용 프로그램에서 사용할 수 있도록 프레임 워크에 이러한 예외가 포함되어 있다고 생각할 것입니다. (분명히 그랬지만 쓸모없는 것으로 표시 되었고 범위가 훨씬 더 큰 것으로 대체되었습니다 .)

어떤 해결책이 있다면, 여러분은 이것을 위해 사용하고 있습니까? 그리고 나는 이것을 빨아 들여 이것에 대한 내 자신의 예외를 굴려야합니까?

부록 편집

일부는 내가 기본값을 제공 할 수 있는지 여부를 묻고 계속합니다. 특정 경우에는 예, 이러한 경우에는 예외가 발생하지 않습니다. 그러나 특정 설정의 경우 적용되지 않습니다. 예 : 데이터베이스 서버 이름 및 자격 증명, 인증 서버 및 설치된 타사 응용 프로그램에 대한 경로.

내가 주로 작업하는 애플리케이션은 배치 모드로 실행되는 콘솔 애플리케이션이며, 메인 메서드에서 포착하고 해당 항목이 적절하게 구성되지 않은 경우 적절하게 기록되는 예외를 던지기를 원한다는 점도 주목할 가치가 있습니다. (내가 물려받은 레거시 코드이며 현재 모든 것이 복숭아 같다고 가정합니다 .)


1
에 대한 문서 System.Configuration.ConfigurationErrorsException 가 업데이트되었습니다.
slolife

답변:


36

예외가 프레임 워크의 기존 예외로 제한되지 않습니다. 기존 예외를 사용하기로 결정한 경우 문서에 따라 서신을 따르지 않아도됩니다. 어떻게 '문서는 설명합니다 프레임 워크는 특정 예외를 사용하지만 방법에 대한 제한을 의미하지 않는다 당신이 기존의 예외 재사용 / 사용을 선택합니다.

응용 프로그램입니다. 문서화하고 구성 값이 누락 된 특정 경우에 발생할 예외를 명확하게 표시하는 한 원하는 예외를 사용할 수 있습니다. 누락 된 값을 매우 구체적으로 표시 하려면 고유 한 ConfigurationSettingMissing 예외 작성을 고려할 수 있습니다.

[Serializable]
public class ConfigurationMissingException : ConfigurationErrorsException
{}

편집 :이 경우 고유 한 예외를 작성하면 예외가 프레임 워크 또는 응용 프로그램에서 발생하는 위치에 대해 혼동이 없음을 보장하는 추가 이점이 있습니다. 프레임 워크는 사용자 지정 예외를 throw하지 않습니다.

업데이트 : 나는 의견에 동의하므로 하위 클래스를 Exception에서 ConfigurationErrorsException으로 변경했습니다. 가능한 경우 기존 Framework 예외에서 사용자 지정 예외를 하위 클래스로 지정하는 것이 일반적으로 응용 프로그램 별 예외가 필요하지 않는 한 Exception 클래스를 피하는 것이 좋습니다.


17
나는 다소 동의하지 않는다. 기존 예외를 사용하려는 경우 문서에 사용 된대로 정확하게 사용해야합니다. 그렇지 않으면 뒤 따르는 사람들을 혼란스럽게 할 것입니다. 당신이 뭔가 다른 일을하려고한다면, 당신이 말한 것처럼 당신 만의 예외를 만드세요.
Robert C. Barth

1
동의하지 않습니다. 사용자 지정 예외를 포착하는 시나리오가없는 한, 구성 오류의 경우는 드물지만 기존 유형 (ConfigurationErrorsException)을 재사용하는 것이 좋습니다. 그리고 사용자 지정 유형을 만들면 ConfigurationErrorsException과 같은 관련 유형에서 파생됩니다.
Joe

@Robert & Joe- 기존 프레임 워크 예외가 의도 한 기능과 일치하지 않게 사용되어야한다고 제안하는 것이 아니라 특정 사례 (누락 된 값)가 일반 사례 (ConfigurationErrorsException)에 맞는 한 약간의 유연성이 있다는 것입니다.
Dave Swersky

1
ASP.NET 응용 프로그램 내에서 ConfigurationErrorsException 및 파생 된 클래스가 보호 된 OnError 메서드 또는 전역 ASAX 오류 이벤트에서 포착되지 않아 예외를 throw하는 경우이 문제가 발생할 수 있습니다. .... 내가 게시 한이 질문을 참조 stackoverflow.com/questions/25299325/...

48

개인적으로 구성 시스템이 아닌 개체 상태의 문제이기 때문에 InvalidOperationException을 사용 합니다 . 결국, 이러한 설정이 구성이 아닌 코드로 설정되도록 허용해야하지 않습니까? 여기서 중요한 부분은 app.config에 줄이 없다는 것이 아니라 필요한 정보가 없다는 것입니다.

나에게 ConfigurationException (그리고 그 대체, ConfigurationErrorsException-잘못된 MSDN 문서에도 불구하고)는 구성 저장, 읽기 등의 오류에 대한 것입니다.


ASP.NET 페이지 보호 OnError 메서드에 의해 처리되기 때문에 InvalidOperationException을 선택했지만 ConfigurationErrorsException 및 그로부터 파생 된 모든 예외는 아닙니다
Mick

2
구성이 잘못되면 InvalidOperationException이 발생하면 정말 놀랍습니다.
keuleJ

18

Daniel Richardson이 말했듯이 ConfigurationErrorsException 은 사용할 수 있습니다. 일반적으로이를 처리 할 시나리오가있는 경우 고유 한 사용자 지정 예외 유형을 만드는 것이 좋습니다. 일반적으로 치명적인 구성 오류의 경우 거의 발생하지 않으므로 기존 ConfigurationErrorsException 유형을 재사용하는 것이 더 적절합니다.

.NET 2.0 이전에는 System.Configuration.ConfigurationException 을 사용하는 것이 좋습니다 . ConfigurationException은 나에게 분명하지 않은 이유로 .NET 2.0에서 더 이상 사용되지 않으며 권장 사항은 ConfigurationErrorsException을 사용하도록 변경되었습니다.

.NET 1.x에서 2.0으로 마이그레이션 할 때 또는 Microsoft가 권장 사항을 다시 변경하기로 결정할 때 한 곳에서 throw되는 예외를 쉽게 변경할 수 있도록 도우미 메서드를 사용하여 예외를 throw합니다.

if(string.IsNullOrEmpty(Configuration.AppSettings("foobar")))
{
   throw CreateMissingSettingException("foobar");
}

...

private static Exception CreateMissingSettingException(string name)
{
    return new ConfigurationErrorsException(
        String.Format
        (
        CultureInfo.CurrentCulture,
        Properties.Resources.MissingConfigSetting,
        name
        )
        );
}

16

IMO 이것이 진정한 대답입니다. +1
LC

그 이유는 다음과 같습니다. 찾을 수없는 SettingsProperty 개체에 대한 예외를 제공합니다. 출처 : 개별 구성 속성에 대한 메타 데이터를 나타내는 클래스로 내부적으로 사용됩니다. 구성의 누락 된 값과 동일하지 않습니다.
Karol Haliński

7

ConfigurationErrorsException설명하는 상황에서 던질 올바른 예외입니다. 이전 버전의 MSDN 설명서 ConfigurationErrorsException가 더 적합합니다.

http://msdn.microsoft.com/en-us/library/system.configuration.configurationerrorsexception(VS.80).aspx

이전 MSDN 요약 및 설명은 다음과 같습니다.

  • 구성 시스템 오류가 발생했을 때 throw되는 예외입니다.
  • ConfigurationErrorsException 예외는 구성 정보를 읽거나 기록하는 동안 에러가 발생할 때 발생한다.

7
from documentation : "이 API는 제품 인프라를 지원하며 사용자 코드에서 직접 사용할 수 없습니다. ConfigurationErrorsException 클래스의 새 인스턴스를 초기화합니다."
Oleg Sh

6

ConfigurationElement 클래스 (ConfigurationSection과 같은 많은 구성 관련 클래스의 기본 클래스)에는 OnRequiredPropertyNotFound라는 메서드가 있습니다 (다른 도우미 메서드도 있음). 당신은 그것을 부를 수 있습니다.

OnRequiredPropertyNotFound는 다음과 같이 구현됩니다.

protected virtual object OnRequiredPropertyNotFound(string name) {
    throw new ConfigurationErrorsException(SR.GetString("Config_base_required_attribute_missing", new object[] { name }), this.PropertyFileName(name), this.PropertyLineNumber(name)); }

1

나는 그것을 빨고 내 자신을 굴릴 것입니다 ...하지만 그렇게하기 전에 시스템 이이 구성 설정에 대한 기본값을 가정하도록 할 수 있습니까? 나는 일반적으로 bu Ops Management 직원을 놓칠 수있는 모든 설정에 대해 그렇게하려고합니다 ... (또는 가능한 한 많은 설정에 대해 말해야합니다. 일부의 경우 시스템에서 기본 결정을 내리는 것이 분명히 적절하지 않습니다. ..)

일반적으로 사용자 지정 예외는 많은 노력이 필요하지 않습니다. 여기에 예가 있습니다.

[Serializable]
public class MyCustomApplicationException : ApplicationException
{
    #region privates
    #endregion privates

    #region properties
    #endregion properties

    public MyCustomApplicationException (string sMessage,
        Exception innerException)
        : base(sMessage, innerException) { }
    public MyCustomApplicationException (string sMessage)
        : base(sMessage) { }
    public MyCustomApplicationException () { }

    #region Serializeable Code
    public MyCustomApplicationException (
       SerializationInfo info, StreamingContext context)
        : base(info, context) { }
    #endregion Serializeable Code
}

2
MSDN : ... 자체 예외를 만들어야하는 응용 프로그램, [...] Exception 클래스에서 사용자 지정 예외를 파생시킵니다. 원래 사용자 지정 예외는 ApplicationException 클래스에서 파생되어야한다고 생각했습니다. 그러나 실제로 이것은 중요한 가치를 추가하는 것으로 밝혀지지 않았습니다.
Gaspar Nagy

그렇습니다. 프레임 워크를 코딩 한 MS 프로그래머가 ApplicationException에서 수많은 CLR 예외를 파생하여 구별의 중요성을 파괴했기 때문이라고 생각합니다. 그래도 해가되지 않는 것 같습니다.
Charles Bretana

1

구성 파일에 사용할 수있는 다른 방법은 AppSettings. 이렇게하면 속성 IsRequired과 구성 시스템이이 검사를 처리하도록 지정할 수 있습니다. 속성이 누락되면 ConfigurationErrorsException이 예외가 발생하므로 해당 예외를 귀하의 경우에 사용해야한다는 답변을 지원한다고 가정합니다.


0

내 일반적인 규칙은 다음과 같습니다.

  1. 누락 된 구성의 경우가 흔하지 않고 다른 예외와 다르게이 경우를 처리하고 싶지 않다고 생각되면 적절한 메시지와 함께 기본 "Exception"클래스를 사용합니다.

    새 예외 ( "여기에 내 메시지") 던지기

  2. 내가 원하거나 다른 대부분의 예외와 다른 방식으로이 케이스를 처리하고 싶을 가능성이 높다고 생각한다면, 사람들이 이미 여기에서 제안한대로 내 유형을 굴릴 것입니다.


0

나는 당신의 질문의 전제에 동의하지 않는 경향이 있습니다.

간단히 말해 애플리케이션 구성 설정이 없거나 잘못된 값이 포함 된 경우 throw되어야하는 표준 예외가 필요합니다. 응용 프로그램에서 사용할 수 있도록 프레임 워크에 이러한 예외가 포함되어 있다고 생각할 것입니다. (분명히 그랬지만 쓸모없는 것으로 표시되었고 범위가 훨씬 더 큰 것으로 대체되었습니다.)

System.Exception에 대한 MSDN 문서에 따르면 ( 예외 클래스 성능상의 이유로 사용자 입력 오류에 대한 예외를 던지지 않아야합니다 (Stack Overflow 및 다른 곳에서 다른 사람들이 지적 했음). 음-사용자 입력이 잘못 입력 된 경우 함수가 false를 반환 할 수없는 이유는 무엇입니까? 그런 다음 응용 프로그램을 정상적으로 종료 할 수 있습니까? 이것은 예외가 발생하는 문제보다 더 많은 디자인 문제인 것 같습니다.

다른 사람들이 지적했듯이 어떤 이유로 든 예외를 처리 해야 한다면 System.Exception에서 상속하여 Exception 유형을 정의 할 수없는 이유가 없습니다.


2
이 특정 시나리오에서 정확히 성능이 중요한 이유는 무엇입니까? IUC를 사용하면 예외가 정확히 한 번만 발생하고 프로세스가 나중에 중단 될 가능성이 높습니다 (물론 사용자에게 멋진 팝업을 표시 한 후). (계속 예정 ...)

2
예외를 던지는 대신 오류 코드를 반환하는 것은 고통 스러울 수 있습니다. 그런 다음 오류 정보를 호출 스택에 직접 전파해야하기 때문입니다. 여러 스택 프레임에 전파 될 수있는 비교적 드문 오류에 대해서는 예외를 사용해야합니다. 둘 다 여기에 적용됩니다.

1
"애플리케이션 구성 설정이 누락되었거나 잘못된 값이 포함 된 경우"를 놓쳤습니다. 이는 잘못된 사용자 입력과 동일하지 않습니다. 이것은 누락 된 기본 구성입니다. 사용자 지정 예외 여야하며 앱 실행을 중지해야합니다.
jcollum

2
이 특정 애플리케이션에서는 거의 전적으로 구성 파일의 설정에 의해 구동됩니다. 설정이 암호화되어 있지 않으면 응용 프로그램을 계속할 수 없으며 종료해야합니다. 사실상 예외가 필요합니다.
Mike Hofer

1
이것은 확실히 의미론에 들어갈 수 있으며 코드의 구조는 분명히 상황에 가장 적합한 구현을 지시합니다. 그래도 디자인에 자유가 있다면 오류를 기록하는 객체와 예외에 대한 우아한 종료, 성능 문제 여부에 관계없이 계속 갈 것입니다.
Matt Jordan

-2

XML Exception을 상속 받거나 그냥 사용해 볼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.