抛出异常的 throw 和 throw ex 的区别

C# 中 使用 throw  和 throw ex 抛出异常的不同点的笔记。

在 C# 中推荐使用 【 throw; 】来抛出异常,【 throw ex; 】会将到现在为止的所有信息(堆栈信息或者InnerException等等)清空。

确认代码如下:

//ゼロ除算エラーを発生させる関数
private void ZeroDivide()
{
    int zero = 0;
    int err = 1 / zero;
}

//exを付けてThrowする関数
private void ThrowEx()
{
    try
    {
        ZeroDivide();
    }
    catch (Exception ex)
    {
        //exを付けて投げる
        throw ex;
    }
}

//ex無しでThrowする関数
private void ThrowOnly()
{
    try
    {
        ZeroDivide();
    }
    catch (Exception ex)
    {
        //exを付けないで投げる
        throw;
    }
}

//ThrowExをテスト
private void button1_Click(object sender, EventArgs e)
{
    try
    {
        ThrowEx();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    //
    //→「throw ex;」時のメッセージ
    //
    //System.DivideByZeroException: 0 で除算しようとしました。
    //   場所 Form1.ThrowEx() 場所 C:\Sample\Form1.cs:行 38
    //   場所 Form1.button1_Click(Object sender, EventArgs e) 場所 C:\Sample\Form1.cs:行 60
    //
    //※本当はZeroDivide関数でエラーが発生したがThrow前の情報が消えている。
    // ThrowEx関数でエラーが発生したかのように見える。
    }
}

//ThrowOnlyをテスト
private void button2_Click(object sender, EventArgs e)
{
    try
    {
        ThrowOnly();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    //
    //→「throw;」時のメッセージ
    //
    //System.DivideByZeroException: 0 で除算しようとしました。
    //   場所 Form1.ZeroDivide() 場所 C:\Sample\Form1.cs:行 26
    //   場所 Form1.ThrowOnly() 場所 C:\Sample\Form1.cs:行 50
    //   場所 Form1.button2_Click(Object sender, EventArgs e) 場所 C:\Sample\Form1.cs:行 72
    //
    //※エラー発生元であるZeroDivideのスタックトレースが消えずに残っている。
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值