0Pricing
C# Academy · 강의

사용자 지정 예외와 오류 설계

작은 사용자 지정 예외를 만들고, 올바른 기본 제공 형식(ArgumentException, InvalidOperationException)을 선택하며, InnerException으로 맥락을 추가합니다.

사용자 지정 예외와 오류 설계은(는) CoddyKit의 무료 C# Academy 강의입니다. 이것은 3개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C# Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C# Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

목적 및 목표

목표: 오류를 명확하게 만들어 포착할 수 있게 합니다.

  • 특정 실패에는 구체적인 형식을 사용합니다.
  • 좋은 메시지와 InnerException으로 맥락을 제공합니다.
  • 적합한 경우 기본 제공 형식을 우선합니다.

사용자 지정 예외 형식

Exception에서 파생하고, 이름을 Exception으로 끝내며, 표준 생성자를 추가하십시오. 작고 유용한 데이터를 담으십시오.

using System;

// Custom, specific to our domain
public sealed class ConfigNotFoundException : Exception
{
  public string Key { get; private set; }

  public ConfigNotFoundException(string key)
    : base("Config key not found: " + key)
  {
    Key = key;
  }

  public ConfigNotFoundException(string key, Exception inner)
    : base("Config key not found: " + key, inner)
  {
    Key = key;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      throw new ConfigNotFoundException("ApiUrl");
    }
    catch (ConfigNotFoundException ex)
    {
      Console.WriteLine(ex.Message);
    }
  }
}

맥락을 위한 InnerException

하위 수준 예외를 도메인 예외로 감싸고 InnerException을 설정하여 근본 원인을 유지하십시오.

using System;
using System.IO;

public sealed class ConfigNotFoundException : Exception
{
  public string Key { get; private set; }
  public ConfigNotFoundException(string key, Exception inner)
    : base("Config key not found: " + key, inner) { Key = key; }
}

public static class Config
{
  public static string Load(string path, string key)
  {
    try
    {
      string[] lines = File.ReadAllLines(path); // may throw
      for (int i = 0; i < lines.Length; i++)
      {
        int idx = lines[i].IndexOf("=");
        if (idx > 0 && lines[i].Substring(0, idx) == key)
          return lines[i].Substring(idx + 1);
      }
      throw new ConfigNotFoundException(key, null);
    }
    catch (IOException io)
    {
      // Wrap low-level error with domain meaning
      throw new ConfigNotFoundException(key, io);
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      Console.WriteLine(Config.Load("missing.cfg", "ApiUrl"));
    }
    catch (ConfigNotFoundException ex)
    {
      Console.WriteLine("Top: " + ex.Message);
      if (ex.InnerException != null)
        Console.WriteLine("Inner: " + ex.InnerException.GetType().Name);
    }
  }
}

먼저 기본 제공 예외 선택

일반적인 문제에는 기본 제공 예외를 사용하십시오: ArgumentNullException, ArgumentOutOfRangeException, FormatException, InvalidOperationException 등입니다.

using System;

public static class MathUtil
{
  public static int Divide(int a, int b)
  {
    if (b == 0) throw new DivideByZeroException();
    return a / b;
  }

  public static int ParsePositive(string text)
  {
    if (text == null) throw new ArgumentNullException("text");
    int value = int.Parse(text); // may throw FormatException
    if (value <= 0) throw new ArgumentOutOfRangeException("text", "must be > 0");
    return value;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try { Console.WriteLine(MathUtil.ParsePositive("-1")); }
    catch (ArgumentOutOfRangeException ex) { Console.WriteLine("Range: " + ex.ParamName); }
  }
}

예외와 가드 비교

예외적인 상황에는 예외를 사용하십시오. 예상되는 실패에는 TryX 가드나 반환 코드를 우선하십시오.

using System;

public static class Parser
{
  // BAD: using exceptions for expected cases
  public static int ParseOrThrow(string s)
  {
    return int.Parse(s); // will throw often for user input
  }

  // GOOD: guard-check pattern for expected failure
  public static bool TryParsePositive(string s, out int value)
  {
    value = 0;
    int tmp;
    if (!int.TryParse(s, out tmp)) return false;
    if (tmp <= 0) return false;
    value = tmp;
    return true;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    int v;
    if (Parser.TryParsePositive("12", out v))
      Console.WriteLine("OK " + v);
    else
      Console.WriteLine("Invalid");
  }
}

오류 설계 확인 목록

확인 목록:

  • 가능하면 기본 제공 형식을 선택하십시오.
  • 그렇지 않으면 표준 생성자를 포함한 작은 CustomException을 만드십시오.
  • 근본 원인을 보존하도록 InnerException을 연결하십시오.
  • 예상하지 못한 경우에는 예외를 사용하고, 예상되는 실패에는 TryX를 사용하십시오.

사용자 지정 예외 설계

간단한 확인: C#에서 사용자 지정 예외 형식을 설계할 때 권장되는 방법은 무엇입니까?

복습

복습: 기본 제공 예외를 우선하고, 그렇지 않으면 표준 생성자를 포함한 작은 사용자 지정 형식을 정의하십시오. 원인을 잃지 않고 맥락을 추가하려면 InnerException을 사용하십시오.

자주 묻는 질문

“사용자 지정 예외와 오류 설계” 강의는 무료인가요?

네 — “사용자 지정 예외와 오류 설계” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C# Academy 강의 전체를 잠금 해제할 수 있습니다. C# Academy 강의에는 총 3개의 강의가 포함되어 있습니다.

“사용자 지정 예외와 오류 설계”에서 뭘 배우나요?

작은 사용자 지정 예외를 만들고, 올바른 기본 제공 형식(ArgumentException, InvalidOperationException)을 선택하며, InnerException으로 맥락을 추가합니다. 브라우저에서 직접 실행하는 실습 코드로 C# Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C# Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C# Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 3개 중 2번째 강의입니다.

“사용자 지정 예외와 오류 설계” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C# Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C# Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. try/catch/finally, throw new와 다시 던지기
  2. 사용자 지정 예외와 오류 설계
  3. IDisposable, using 문
← C# Academy(으)로 돌아가기