C#에서 잘못된 인수 또는 매개 변수에 대해 throw되는 예외 유형

Syed Hassan Sabeeh Kazmi 2023년10월12일
  1. C#의 유효하지 않거나 예기치 않은 매개변수에 대해 ArgumentException 발생
  2. C#에서 유효하지 않거나 예기치 않은 매개변수에 대해 ArgumentNullException 발생
  3. C#의 유효하지 않거나 예기치 않은 매개변수에 대해 ArgumentOutOfRangeException 발생
  4. C#에서 유효하지 않거나 예기치 않은 매개변수에 대한 사용자 정의 예외 생성
C#에서 잘못된 인수 또는 매개 변수에 대해 throw되는 예외 유형

예외는 C# 프로그램의 런타임 오류 또는 발생할 것으로 예상되지 않거나 시스템/응용 프로그램 제약 조건을 위반하는 조건에 대한 정보를 제공합니다. 이 자습서에서는 잘못된 인수 또는 매개 변수와 관련된 세 가지 예외 및 C# 프로그램에서 이를 throw하는 방법을 배웁니다.

유효하지 않은 인수 또는 매개변수를 포착할 때 예외를 발생시키는 코드 블록을 정의하는 것이 예기치 않은 오류를 처리하는 가장 쉬운 방법입니다. 잘못된 코드나 사용자 입력은 오류를 유발할 수 있으며, 이를 감지하려면 C# 애플리케이션 코드 또는 런타임에서 예외가 발생해야 합니다.

C#의 유효하지 않거나 예기치 않은 매개변수에 대해 ArgumentException 발생

메소드가 유효하지 않은 인수를 수신하면 ArgumentException이 발생합니다. ArgumentException.GetType().Name 속성을 사용하여 예외 개체의 이름을 표시합니다.

Message 속성을 사용하면 발생 이유가 포함된 예외 메시지의 텍스트를 표시할 수 있습니다. C#에서 예외를 던질 때마다 해당 예외의 Message 속성에는 잘못된 인수와 예상되는 인수 값 범위를 설명하는 의미 있는 메시지가 포함되어야 합니다.

ArgumentNullExceptionArgumentOutOfRangeExceptionArgumentException 클래스의 파생 클래스입니다. ArgumentException 클래스 자체는 System.SystemException 클래스에서 상속됩니다.

일반적으로 System.Exception은 C#에서 잘못된 인수 또는 매개변수에 대해 발생하는 모든 예외의 기본 클래스입니다.

using System;

namespace ArgumentExceptionExp {
  class UserEnrollment {
    static void Main(string[] args) {
      Console.WriteLine("Please enter your first name and last name for enrollment.");

      Console.WriteLine("First Name: ");
      var userFirstN = Console.ReadLine();

      Console.WriteLine("Last Name: ");
      var userLastN = Console.ReadLine();

      try {
        var userFullN = ShowFullUserName(userFirstN, userLastN);
        Console.WriteLine($"Congratulations, {userFullN}!");
      } catch (ArgumentException ex) {
        Console.WriteLine("Something went wrong, please try again!");
        Console.WriteLine(ex);
      }
    }

    static string ShowFullUserName(string userFirstN, string userLastN) {
      if (userFirstN == "" || userLastN == "")
        throw new ArgumentException(
            "Attention, please! Your first or last user name cannot be empty.");
      return $"{userFirstN} {userLastN}";
    }
  }
}

출력:

Please enter your first name and last name for enrollment.
First Name:

Last Name:
Kazmi
Something went wrong, please try again!
System.ArgumentException: Attention, please! Your first or last user name cannot be empty.
  at ArgumentExceptionExp.UserEnrollment.ShowFullUserName (System.String userFirstN, System.String userLastN) [0x00020] in <8fb4997067094d929e0f81a3893882f9>:0
  at ArgumentExceptionExp.UserEnrollment.Main (System.String[] args) [0x0002f] in <8fb4997067094d929e0f81a3893882f9>:0

이 경우 ArgumentException은 예기치 않거나 잘못된 활동으로 인해 메서드가 정상적인 기능을 완료하지 못하는 경우에만 throw됩니다. 디버깅할 때 추가 정보를 제공하기 위해 다시 throw되는 예외에 정보를 추가하는 것은 좋은 프로그래밍 방법입니다.

throw 키워드와 System.Exception 클래스에서 파생된 새 인스턴스를 사용하여 예외를 throw할 수 있습니다. .NET 프레임워크는 잘못된 인수 및 매개변수를 처리하는 데 사용할 수 있는 많은 표준 사전 정의 예외 유형을 제공합니다.

C#에서 유효하지 않거나 예기치 않은 매개변수에 대해 ArgumentNullException 발생

C# 프로그램의 메서드가 유효한 인수로 받아들이지 않는 null 참조를 수신하면 오류를 이해하기 위해 ArgumentNullException을 throw해야 합니다. 오류를 방지하기 위해 인스턴스화되지 않은 개체가 메서드에 전달될 때 런타임에 throw됩니다.

또한 메서드 호출에서 반환된 개체가 두 번째 메서드에 인수로 전달되었지만 원래 반환된 개체의 값이 null인 경우 throw됩니다.

동작은 ArgumentException과 동일합니다. 그러나 값이 0x80004003HRESULT E_POINTER를 사용합니다.

using System;

namespace TryCatchArgNullExcep {
  class ArgNullExpProgram {
    static void Main(string[] args) {
      try {
        var ArgNullEVariable = new ArgNullMember(null, 32);
      } catch (ArgumentNullException ex) {
        Console.WriteLine("Sorry for the inconvenience, something went wrong...");
        Console.WriteLine(ex);
      }
    }

    class ArgNullMember {
      public ArgNullMember(string memberName, int memberAge) {
        if (memberName == null)
          throw new ArgumentNullException(
              nameof(memberName), "The member name cannot be `null` or empty. Please, try again!");

        MemberName = memberName;
        MemberAge = memberAge;
      }
      public string MemberName { get; private set; }
      public int MemberAge { get; private set; }
    }
  }
}

출력:

Sorry for the inconvenience, something went wrong...
System.ArgumentNullException: The member name cannot be `null` or empty. Please, try again!
Parameter name: memberName
  at TryCatchArgNullExcep.ArgNullExpProgram+ArgNullMember..ctor (System.String memberName, System.Int32 memberAge) [0x00010] in <1001b7741efd42ec97508d09c5fc60a2>:0
  at TryCatchArgNullExcep.ArgNullExpProgram.Main (System.String[] args) [0x00002] in <1001b7741efd42ec97508d09c5fc60a2>:0

C#의 유효하지 않거나 예기치 않은 매개변수에 대해 ArgumentOutOfRangeException 발생

이 예외는 인수 값이 C#에서 호출된 메서드에 정의된 허용 가능한 값 범위를 벗어날 때 throw됩니다. 일반적으로 ArgumentOutOfRangeException은 개발자 오류로 인해 발생합니다.

try/catch 블록에서 처리하는 대신 예외의 원인을 제거하거나 인수를 메서드에 전달하기 전에 유효성을 검사해야 합니다.

클래스는 System.CollectionsSystem.IO 네임스페이스, 어레이 클래스 및 String 클래스의 문자열 조작 메서드에서 이를 광범위하게 사용합니다. C#의 CLR 또는 다른 클래스 라이브러리에서 발생하며 개발자 오류를 나타냅니다.

using System;

namespace ArgumentOutOfRangeExceptionExp {
  class userInfo {
    static void Main(string[] args) {
      try {
        Console.WriteLine("Enter User Name: ");
        string Hassan = Console.ReadLine();

        Console.WriteLine("Enter your Age: ");
        int ageU = Int32.Parse(Console.ReadLine());

        var user = new userInfoProcess(Hassan, ageU);
      } catch (ArgumentOutOfRangeException ex) {
        Console.WriteLine("Please be patient, something went wrong.");
        Console.WriteLine(ex);
      }
    }
  }

  class userInfoProcess {
    public userInfoProcess(string userName, int userAge) {
      if (userName == null) {
        throw new ArgumentOutOfRangeException(nameof(userName),
                                              "Your username is invalid, please try again!");
      } else if (userName == "") {
        throw new ArgumentOutOfRangeException(nameof(userName),
                                              "Your username is invalid, please try again!");
      }
      if (userAge < 18 || userAge > 50)
        throw new ArgumentOutOfRangeException(
            nameof(userAge), "Your age is outside the allowable range, please enter a valid user.");

      ArgNullUName = userName;
      ArgNullUAge = userAge;
    }
    public string ArgNullUName { get; private set; }
    public int ArgNullUAge { get; private set; }
  }
}

출력:

Enter User Name:
Hassan
Enter your Age:
11
Please be patient, something went wrong.
System.ArgumentOutOfRangeException: Your age is outside the allowable range, please enter a valid user.
Parameter name: userAge
  at ArgumentOutOfRangeExceptionExp.userInfoProcess..ctor (System.String userName, System.Int32 userAge) [0x00052] in <b199b92ace93448f8cc4c37cc4d5df33>:0
  at ArgumentOutOfRangeExceptionExp.userInfo.Main (System.String[] args) [0x00029] in <b199b92ace93448f8cc4c37cc4d5df33>:0

C#에서 유효하지 않거나 예기치 않은 매개변수에 대한 사용자 정의 예외 생성

C#에서 잘못된 인수 또는 매개 변수에 대한 예외를 정의할 수도 있습니다. 사용자 정의 예외 클래스는 Exception 클래스에서 파생됩니다.

try/catchfinally 블록에서 지원하는 C#의 예외 처리는 코드 런타임 오류를 감지하고 처리하는 메커니즘입니다.

using System;

namespace UserDefinedExceptionExp {
  class ExceptionHandlingC {
    static void Main(string[] args) {
      string Name = "Hassan";
      int Age = 18;
      Check temp = new Check();

      try {
        temp.checkTemp(Name, Age);
      } catch (InvalidNameException e) {
        Console.WriteLine("InvalidNameException: {0}", e.Message);
      }
      Console.ReadKey();
    }
  }
}
public class InvalidNameException : Exception {
  public InvalidNameException(string message) : base(message) {}
}
public class Check {
  public void checkTemp(string name, int age) {
    // this exception will be thrown if the user name will be `Hassan`
    if (name == "Hassan") {
      throw(new InvalidNameException("User is not valid."));
    } else {
      Console.WriteLine("You are successfully signed in with the name: {0}", name);
    }
  }
}

출력:

InvalidNameException: User is not valid.

이 자습서에서는 잘못된 인수 및 매개 변수에 대해 일반적으로 발생하는 세 가지 예외 유형과 C#에서 사용자 정의 예외를 만드는 방법을 배웠습니다.

비결은 무엇이 잘못되었는지, 왜 잘못되었는지, C# 프로그램에서 이를 수정하는 방법에 대한 세부 정보를 제공하는 올바른 예외를 사용하고 throw하는 것입니다.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

관련 문장 - Csharp Exception