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> 引发异常。

在下一节中了解如何创建自定义异常类型。