C#의 오류 처리를 위한 5가지 모범 사례

프로그램이나 앱에 버그가 발생하지 않도록 하는 가장 좋은 방법은 코드에서 발생할 수 있는 오류를 처리하지 않는 것입니다. 피할 수 있으면 확인하고 발생했을 때 처리할 필요가 없겠죠?

이론적으로는 그럴 듯하지만 오류 발생을 완전히 방지하는 것이 항상 가능한 것은 아닙니다. 그렇지 않으면 프로그램이나 앱이 전혀 없을 것입니다! 오류가 발생하고 프로그램이 자체적으로 복구할 수 없는 경우 오류를 처리하는 방법은 오류의 원인과 문제가 발생한 위치에 대해 오류가 제공하는 정보의 양에 따라 달라집니다.

그래서 C#에서 오류를 처리하는 간단하고 유용한 5가지 방법을 설명하기로 결정했습니다.


오류 처리가 무엇인지 이해하기



무엇보다도 오류 처리가 무엇을 의미하는지 이해하는 것이 필요합니다. term error handling은 오류 발생 시 소프트웨어 응용 프로그램의 반응 및 복구 메커니즘을 나타냅니다. 즉, 응용 프로그램, 프로그램 또는 통신의 오류를 정확하게 예측, 감지 및 해결하는 프로세스입니다.

오류 처리를 통해 프로그램의 일반 실행 흐름을 유지하는 것이 더 쉬워집니다. 오류 처리 접근 방식과 관련하여 많은 애플리케이션에서 실제로 많은 아키텍처 문제에 직면합니다.

🧠기억하세요: 던져진 오류는 좋습니다.


항상 예외 스택 추적


throw e; 를 사용하는 것은 C#에서 단순히 throw; 를 사용하여 catch 블록에서 예외를 throw할 수 있기 때문에 catch된 예외를 throw하는 좋은 방법이 아닙니다.

이렇게 하면 스택을 추적하고 예외를 훨씬 더 잘 볼 수 있습니다.

나쁜 방법:

try
{
    FunctionThatMightThrow();
}
catch (Exception ex)
{
    logger.LogInfo(ex);
    throw ex;
}


좋은 방법:

try
{
    FunctionThatMightThrow();
}
catch (Exception error)
{
    logger.LogInfo(error);
    throw;
}


예외에 정보를 포함하는 것은 오류 디버깅에 도움이 되므로 좋은 습관입니다. 반면에 목표가 예외를 기록하는 것이라면 throw를 사용하여 책임을 호출자에게 전달해야 합니다.


"throw ex" 사용 피하기



언뜻 보기에 모든 개발자는 throw ex가 예외를 포착한 후 예외를 다시 발생시키는 가장 좋은 방법이라고 믿을 수 있습니다. 예, 간단한 방법이지만 올바른 방법은 아닙니다. 이 옵션은 스택 추적을 잃게 되므로 좋지 않습니다.

나쁜 방법:

try
{
    // Do something..
}
catch (Exception ex)
{
    // Any action something like roll-back or logging etc.
    throw ex;
}


좋은 방법:

try
{
    // Do something..
}
catch (Exception ex)
{
    // Any action something like roll-back or logging etc.
    throw;
}


우리는 내가 단순히 throw를 사용했다는 것을 좋은 방법으로 볼 수 있습니다. 이러한 방식으로 원래 예외 스택이 보존됩니다. 그렇지 않으면 throw ex 로 이 문이 호출된 코드 줄로 덮어쓰게 됩니다.


if 조건 사용을 피하십시오



예외의 종류에 따라 다른 작업을 수행해야 하는 경우 예외 처리를 위해 수많은 catch 블록을 사용하는 것을 고려해야 합니다. 나쁜 습관은 if 조건부를 사용하는 것입니다.

나쁜 방법:

try
{
    // Do something..
}
catch (Exception ex)
{
    if (ex is TaskSchedulerException)
    {
        // Take action
    }
    else if (ex is TaskCanceledException)
    {
        // Take action
    }
}


좋은 방법:

try
{
    // Do something..
}
catch (TaskCanceledException ex)
{
    // Take action 
}
catch (TaskSchedulerException ex)
{
    // Take action
}


여러 개의 catch 블록을 생성하더라도 항상 최종 catch 블록으로 Exception 인수를 포함하는 catch 블록을 생성하는 것이 좋습니다. 보조 캐치 블록으로 제공됩니다.


포착된 오류를 항상 분석



오류를 발견하면 오류를 수정하거나 조치를 취할 기회가 없기 때문에 오류를 무시하고 내버려 두는 것은 의미가 없습니다.

오류가 발생할 수 있다는 것을 알고 있다면 해당 코드를 try/catch로 래핑하는 것이 항상 더 좋습니다.

나쁜 방법:

try
{
    FunctionThatMightThrow();
}
catch (Exception ex)
{
    // silent exception
}


좋은 방법:

try
{
    FunctionThatMightThrow();
}
catch (Exception error)
{
    NotifyUserOfError(error);
    // Another option
    ReportErrorToService(error);
}


우리가 볼 수 있듯이 오류를 던지는 것은 모든 인쇄된 항목 사이에서 콘솔에서 손실될 수 있기 때문에 훌륭한 해결책이 아닙니다. try/catch로 래핑하면 나중에(오류가 발생하는 경우) 계획을 만들거나 이를 처리하는 방법에 대한 코드 경로를 가질 수 있습니다.


이 팁은 Clean Code Javascript 에서 수정되었습니다. 큰 기여를 해주셔서 감사합니다Ryan McDermott!

좋은 웹페이지 즐겨찾기