English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C#のthrowキーワード

前節でCLRが自動的に発生させる例外の処理方法を見たことを覚えています。ここでは、例外を手動で発生させる方法を見てみましょう。

throwキーワードを使用して手動で例外を発生させることができます。throwキーワードを使用して、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 对象为null");
        
    Console.WriteLine(std.StudentName);
}
出力:
Studentオブジェクトがnull

上記の例では、Studentオブジェクトがnullの場合、PrintStudentName()メソッドがNullReferenceExceptionを投げます。

注意していただきたいのは、throwはnewキーワードを使用して有効な例外クラスのオブジェクトを作成します。throwはExceptionクラスから派生していない他のどんなタイプとも一緒には使用できません。

例外を再抛出する

catchブロックから例外を再発し、呼び出し元に伝播させ、呼び出し元が必要な方法で処理できるようにすることもできます。以下の例では例外を再発します。

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キーワード(throw eではなく)を使用して例外を発生させます。これは、Method1()的catchブロックで処理され、ここで再び同じ例外を再発し、最終的にMain()メソッドで処理されます。この例外のスタックトレースは、例外の詳細な完全な情報を提供します。

如果使用异常参数重新抛出异常,则它将不会保留原始异常并创建新的异常。以下示例对此进行了演示。

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 メソッドのスタックトレースと一緒に。1throw ex を throw で再投げると、メソッド名がスタックトレースに表示されません。1したがって、決して throw < exception parameter parameter > を使って例外を投げないでください。

次のセクションでカスタム例外型の作成方法について学びます。