异常处理
C#使用throw
关键字和try...catch...finally...
语句对异常进行抛出和捕获处理,良好的异常处理机制能够极大的提升我们代码的健壮性。这篇笔记我们学习如何捕获和抛出异常。
捕获异常
下面例子我们捕获一个除以零异常。
using System;
namespace Gacfox.Demo.DemoNetCore
{
class Program
{
static void Main(string[] args)
{
int i = 1;
int j = 0;
try
{
int k = i / j;
}
catch (DivideByZeroException ex)
{
Console.WriteLine("\nMessage ---\n{0}", ex.Message);
Console.WriteLine("\nHelpLink ---\n{0}", ex.HelpLink);
Console.WriteLine("\nSource ---\n{0}", ex.Source);
Console.WriteLine("\nStackTrace ---\n{0}", ex.StackTrace);
Console.WriteLine("\nTargetSite ---\n{0}", ex.TargetSite);
}
finally
{
Console.WriteLine("finally执行");
}
}
}
}
注意异常对象ex
的用法,ex
中有一些定义好的字段,用来存储异常的各种信息:异常消息,错误栈等,我们可以按需取用。
抛出异常
C#中,所有异常继承于System.Exception
,其下有两个子类SystemException
和ApplicationException
,我们自定义的异常通常继承ApplicationException
。抛出异常使用throw
关键字。
下面例子代码中,我们抛出了一个ApplicationException
,并使用try...catch...
捕获。
using System;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
try
{
throw new ApplicationException();
}
catch (Exception ex)
{
Console.WriteLine("\nMessage ---\n{0}", ex.Message);
Console.WriteLine("\nHelpLink ---\n{0}", ex.HelpLink);
Console.WriteLine("\nSource ---\n{0}", ex.Source);
Console.WriteLine("\nStackTrace ---\n{0}", ex.StackTrace);
Console.WriteLine("\nTargetSite ---\n{0}", ex.TargetSite);
}
}
}
}
C#异常机制和Java的对比
和Java相比,C#没有受检查异常,因此也没有throws
关键字,个人认为这是个糟糕的设计,因为编译器不能帮助我们检查某些必要的异常处理是否编写好了。而Java中,一些老旧的库(如JDBC)过度使用了受检查异常,这是库编写的问题,而不是受检查异常机制设计的不好。当然,个人观点仅供参考。
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。