C# - 抛出关键字
本文关键字:关键字 出关 | 更新日期: 2023-09-12 17:39:53
我们在上一节中已经看到了如何处理 CLR 自动引发的异常。在这里,我们将看到如何手动引发异常。
可以使用 throw 关键字手动引发异常。从 Exception 类派生的任何类型的异常都可以使用 throw 关键字引发。
Example: throw an exception
static void Main(string[] args)
{
Student std = null;
try
{
PrintStudentName(std);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message );
}
Console.ReadKey();
}
private static void PrintStudentName( Student std)
{
if (std == null)
throw new NullReferenceException("Student object is null.");
Console.WriteLine(std.StudentName);
}
输出:
Student object is null.在上面的示例中,如果 Student 对象为 null,则 PrintStudentName() 方法会引发 NullReferenceException。
请注意,throw 使用 new 关键字创建任何有效异常类型的对象。throw 关键字不能与不是从 Exception 类派生的任何其他类型一起使用。
重新引发异常
您还可以从 catch 块中重新引发异常以传递给调用方,并让调用方按照他们想要的方式处理它。 下面的示例重新引发异常。
Example: throw an exception
static void Main(string[] args)
{
try
{
Method1();
}
catch(Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}
static void Method1()
{
try
{
Method2();
}
catch(Exception ex)
{
throw;
}
}
static void Method2()
{
string str = null;
try
{
Console.WriteLine(str[0]);
}
catch(Exception ex)
{
throw;
}
}
在上面的示例中,Method2() 中发生了异常。catch 块只是使用 throw 关键字(而不是抛出 e)抛出该异常。 这将在 Method1() 的 catch 块中处理,它再次抛出相同的异常,最后在 Main() 方法中处理。 此异常的堆栈跟踪将为您提供此异常发生位置的完整详细信息。
如果使用异常参数重新引发异常,则它不会保留原始异常并创建新的异常。 下面的示例对此进行了演示。
Example: throw an exception
static void Main(string[] args)
{
try
{
Method1();
}
catch(Exception ex)
{
Console.WriteLine(ex.StackTrace);
}
}
static void Method1()
{
try
{
Method2();
}
catch(Exception ex)
{
throw ex;
}
}
static void Method2()
{
string str = null;
try
{
Console.WriteLine(str[0]);
}
catch(Exception ex)
{
throw;
}
}
在上面的示例中,在 Main() 方法中捕获的异常将显示来自 Method1 和 Main 方法的堆栈跟踪。它不会在堆栈跟踪中显示方法1,因为我们使用throw ex
在方法1()中重新抛出异常。
因此,切勿使用 throw <exception parameter>
引发异常。
在下一节中了解如何创建自定义异常类型。