C# 中为无效参数或参数引发的异常类型
异常提供有关 C# 程序中的运行时错误或预期不会发生或违反系统/应用程序约束的条件的信息。在本教程中,你将学习与无效参数或参数相关的三种不同异常,以及如何在 C# 程序中抛出它们。
定义一个在捕获无效参数或参数时引发异常的代码块是处理意外错误的最简单方法。错误的代码或用户输入可能会导致错误,它们的检测需要 C# 应用程序代码或运行时抛出异常。
为 C#
中的无效或意外参数抛出 ArgumentException
当方法接收到无效参数时,会引发 ArgumentException
。它使用 ArgumentException.GetType().Name
属性来显示异常对象的名称。
使用 Message
属性,你可以显示异常消息的文本,其中包含其发生背后的原因。重要的是,每当你在 C# 中引发异常时,该异常的 Message
属性必须包含有意义的消息来描述无效参数和参数的预期值范围。
ArgumentNullException
和 ArgumentOutOfRangeException
是 ArgumentException
类的派生类。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.Collections
和 System.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/catch
和 finally
块支持,是一种检测和处理代码运行时错误的机制。
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# 程序中修复它的详细信息。
相关文章
C# 中的树形数据结构
发布时间:2024/01/20 浏览次数:73 分类:编程语言
-
C# 中的树是本文讨论的主题。一种以树的形式组织起来的层次数据称为树数据结构。C# 中的树将是本文讨论的主题。数据结构是我们需要知道的第一件事。
C# 中的 lock 语句
发布时间:2024/01/20 浏览次数:166 分类:编程语言
-
C# 中 lock 语句指定的代码部分不能被多个线程同时访问。C# 中的 lock 语句 lock(obj) 语句规定,在 C# 中,下面这段代码不能被多个线程同时访问。
等待线程在 C# 中完成
发布时间:2024/01/20 浏览次数:70 分类:编程语言
-
等待 C# 中的线程完成的主要方法有两种:Task.WaitAll()和 Thread.Join()函数。用 C# 中的 Task.WaitAll() 方法等待线程完成 C# 中的 [Task.WaitAll() 方法)用于等待 Task 类的所有对象的完成。
C# 中的线程与任务
发布时间:2024/01/20 浏览次数:127 分类:编程语言
-
Thread 类创建一个实际的 OS 线程,而 Task 类创建一个在线程池中异步执行的任务。Thread 类在 C# 中创建实际的操作系统级别的线程。用 Thread 类创建的线程会占用堆栈内存等资源,上下文的 CPU 开
在 C# 中停止线程
发布时间:2024/01/20 浏览次数:138 分类:编程语言
-
在本文中,我将解释如何在 C# 中启动和停止线程。有时,在 C# 中使用线程时,你可能会遇到需要终止线程的情况。C# 确实为你提供了成功执行此操作的方法,本文旨在解释在 C# 中终止线程的过
C# 中的 Thread.Sleep()
发布时间:2024/01/20 浏览次数:128 分类:编程语言
-
在本指南中,我们将了解为什么在 C# 中使用 thread.sleep() 被认为是有害的。在本指南中,我们将了解为什么在 C# 中使用 thread.sleep() 被认为是有害的,以及为什么不应该使用这种特殊方法。
C# 中的 extern 关键字
发布时间:2024/01/20 浏览次数:125 分类:编程语言
-
在今天的文章中,我们将学习 C# 中 extern 关键字的功能。在今天的文章中,我们将学习 C# 中 extern 关键字的功能。
C# 将 Int 转换为 Char
发布时间:2024/01/20 浏览次数:137 分类:编程语言
-
本教程教授如何在 C# 中将 int 转换为 char。在 C# 中使用显式类型转换 Char 将 Int 转换为 Char