先看一段代码:方法A()抛出了一个无参的异常,可以理解为继续抛出一个已经存在的异常。
方法B()抛出了一个命名的异常变量,改变了StackTrace(堆栈轨迹)。
方法C()创建了一个新的异常。提示:你可以通过这种方法实现自定义的的错误处理
using System;
class Program
{
static void Main()
{
try
{
A();
B();
C(null);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
static void A()
{
try
{
int value = 1 / int.Parse("0");
}
catch
{
throw; //方法A()抛出了一个无参的异常,可以理解为继续抛出一个已经存在的异常
}
}
static void B()
{
try
{
int value = 1 / int.Parse("0");
}
catch (DivideByZeroException ex) //方法B()throw一个命名的异常变量,改变了StackTrace(堆栈轨迹) -- 抛出特定的异常,也即过滤得到特定的异常 {
throw ex;
}
}
static void C(string value)
{
if (value == null)
{
throw new ArgumentNullException("value");//创建一个新的异常
}
}
}
无参和有参throw的区别:有参throw 会改变异常的TargetSite位置。
Y() 将异常的TargetSite位置修改到Y()方法里。
using System;
class Program
{
static void Main()
{
try
{
X();
}
catch (Exception ex)
{
Console.WriteLine(ex.TargetSite);
}
try
{
Y();
}
catch (Exception ex)
{
Console.WriteLine(ex.TargetSite);
}
}
static void X()
{
try
{
int.Parse("?");
}
catch (Exception)
{
throw; // [Rethrow 构造]
}
}
static void Y()
{
try
{
int.Parse("?");
}
catch (Exception ex)
{
throw ex; // [Throw 捕获的ex变量]
}
}
}