不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
C#使用throw和throw ex抛出异常两者的区别[转]
编辑:dnawo 日期:2020-03-23
我们都知道,C#中使用throw和throw ex抛出异常,但二者是有区别的。C#推荐使用throw来抛出异常,throw ex会将到现在为止的所有信息清空,认为你catch到的异常已经被处理了,只不过处理过程中又抛出新的异常,从而找不到真正的错误源。
C#抛出异常主要有以下几种:
第一种(不推荐使用,可惜很多人都一直这么用的,包括俺,嘻嘻),这样适用会吃掉原始异常点,重置堆栈中的异常起始点:
第二种,可追溯到原始异常点,不过编译器会警告,定义的ex未有使用:
第三种,不带异常参数的,这个同第二种其实一样,可捕获所有类型的异常,IDE不会告警:
其实第二种和第三种用法,书上也是不建议使用的,一般要从小粒度的异常捕获开始,采用多个catch语句,大家就见仁见智吧。。。
第四种:经过对异常重新包装,但是会保留原始异常点信息,推荐使用:
下面用个例子来加以说明:

从运行的结果可以看到,第一种用法已经吃掉了原始异常信息。而其它3种用法都可以追溯到原始异常,推荐使用第四种用法,希望大家能了解这些细微的差别,享受Coding的乐趣吧...
C#抛出异常主要有以下几种:
第一种(不推荐使用,可惜很多人都一直这么用的,包括俺,嘻嘻),这样适用会吃掉原始异常点,重置堆栈中的异常起始点:
复制内容到剪贴板
程序代码

try
{
}
catch (Exception ex)
{
throw ex;
}
{
}
catch (Exception ex)
{
throw ex;
}
第二种,可追溯到原始异常点,不过编译器会警告,定义的ex未有使用:
复制内容到剪贴板
程序代码

try
{
}
catch (Exception ex)
{
throw;
}
{
}
catch (Exception ex)
{
throw;
}
第三种,不带异常参数的,这个同第二种其实一样,可捕获所有类型的异常,IDE不会告警:
复制内容到剪贴板
程序代码

try
{
}
catch
{
throw;
}
{
}
catch
{
throw;
}
其实第二种和第三种用法,书上也是不建议使用的,一般要从小粒度的异常捕获开始,采用多个catch语句,大家就见仁见智吧。。。
第四种:经过对异常重新包装,但是会保留原始异常点信息,推荐使用:
复制内容到剪贴板
程序代码

try
{
}
catch (Exception ex)
{
throw new Exception("经过进一步包装的异常", ex);
}
{
}
catch (Exception ex)
{
throw new Exception("经过进一步包装的异常", ex);
}
下面用个例子来加以说明:
复制内容到剪贴板
程序代码

class Program
{
public static void Main(string[] args)
{
ExceptionClass ec = new ExceptionClass();
try
{
ec.ExceptionThrow1();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("---------------------------------------------------------------------");
try
{
ec.ExceptionThrow2();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("---------------------------------------------------------------------");
try
{
ec.ExceptionThrow3();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("---------------------------------------------------------------------");
try
{
ec.ExceptionThrow4();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("---------------------------------------------------------------------");
Console.ReadKey();
}
}
/// <summary>
/// 该Class用来测试异常抛出时相关上下文栈的调用情况
/// </summary>
public class ExceptionClass
{
/// <summary>
/// 抛出异常方法
/// </summary>
public void ExceptionThrow1()
{
try
{
// 调用原始异常抛出方法来抛出异常
this.ExceptionMethod();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 抛出异常方法1
/// </summary>
public void ExceptionThrow2()
{
try
{
this.ExceptionMethod();
}
catch (Exception ex)
{
throw;
}
}
/// <summary>
/// 抛出异常方法2
/// </summary>
public void ExceptionThrow3()
{
try
{
this.ExceptionMethod();
}
catch
{
throw;
}
}
/// <summary>
/// 抛出异常方法3
/// </summary>
public void ExceptionThrow4()
{
try
{
this.ExceptionMethod();
}
catch (Exception ex)
{
throw new Exception("经过进一步包装的异常", ex);
}
}
/// <summary>
/// 原始异常抛出方法
/// </summary>
private void ExceptionMethod()
{
throw new DivideByZeroException();
}
}
{
public static void Main(string[] args)
{
ExceptionClass ec = new ExceptionClass();
try
{
ec.ExceptionThrow1();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("---------------------------------------------------------------------");
try
{
ec.ExceptionThrow2();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("---------------------------------------------------------------------");
try
{
ec.ExceptionThrow3();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("---------------------------------------------------------------------");
try
{
ec.ExceptionThrow4();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.WriteLine("---------------------------------------------------------------------");
Console.ReadKey();
}
}
/// <summary>
/// 该Class用来测试异常抛出时相关上下文栈的调用情况
/// </summary>
public class ExceptionClass
{
/// <summary>
/// 抛出异常方法
/// </summary>
public void ExceptionThrow1()
{
try
{
// 调用原始异常抛出方法来抛出异常
this.ExceptionMethod();
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 抛出异常方法1
/// </summary>
public void ExceptionThrow2()
{
try
{
this.ExceptionMethod();
}
catch (Exception ex)
{
throw;
}
}
/// <summary>
/// 抛出异常方法2
/// </summary>
public void ExceptionThrow3()
{
try
{
this.ExceptionMethod();
}
catch
{
throw;
}
}
/// <summary>
/// 抛出异常方法3
/// </summary>
public void ExceptionThrow4()
{
try
{
this.ExceptionMethod();
}
catch (Exception ex)
{
throw new Exception("经过进一步包装的异常", ex);
}
}
/// <summary>
/// 原始异常抛出方法
/// </summary>
private void ExceptionMethod()
{
throw new DivideByZeroException();
}
}

从运行的结果可以看到,第一种用法已经吃掉了原始异常信息。而其它3种用法都可以追溯到原始异常,推荐使用第四种用法,希望大家能了解这些细微的差别,享受Coding的乐趣吧...






评论: 0 | 引用: 0 | 查看次数: 3126
发表评论
请登录后再发表评论!