C# 中為無效引數或引數引發的異常型別

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. C# 中的無效或意外引數丟擲 ArgumentException
  2. C# 中為無效或意外的引數丟擲 ArgumentNullException
  3. C# 中為無效或意外引數丟擲 ArgumentOutOfRangeException
  4. C# 中為無效或意外引數建立使用者定義的異常
C# 中為無效引數或引數引發的異常型別

異常提供有關 C# 程式中的執行時錯誤或預期不會發生或違反系統/應用程式約束的條件的資訊。在本教程中,你將學習與無效引數或引數相關的三種不同異常,以及如何在 C# 程式中丟擲它們。

定義一個在捕獲無效引數或引數時引發異常的程式碼塊是處理意外錯誤的最簡單方法。錯誤的程式碼或使用者輸入可能會導致錯誤,它們的檢測需要 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 關鍵字引發異常,後跟從 System.Exception 類派生的新例項。 .NET 框架提供了許多標準的預定義異常型別,你可以使用它們來處理無效的引數和引數。

C# 中為無效或意外的引數丟擲 ArgumentNullException

當 C# 程式中的方法接收到不接受它作為有效引數的空引用時,需要丟擲 ArgumentNullException 以瞭解錯誤。當將未例項化的物件傳遞給方法以防止錯誤時,它會在執行時引發。

此外,當從方法呼叫返回的物件作為引數傳遞給第二個方法時,它會被丟擲,但原始返回物件的值為 null

它的行為與 ArgumentException 相同;但是,它使用 HRESULT E_POINTER,其值為 0x80004003

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# 中呼叫的方法定義的允許值範圍時,將引發此異常。通常,開發人員錯誤會導致 ArgumentOutOfRangeException

與其在 try/catch 塊中處理它,你應該消除異常的原因或在將引數傳遞給方法之前驗證引數。

類在 System.CollectionsSystem.IO 名稱空間、陣列類和 String 類中的字串操作方法中廣泛使用它。它由 CLR 或 C# 中的其他類庫引發,並指示開發人員錯誤。

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 類。

C# 中的異常處理由 try/catchfinally 塊支援,是一種檢測和處理程式碼執行時錯誤的機制。

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# 程式中修復它的詳細資訊。

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