异常处理

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,其下有两个子类SystemExceptionApplicationException,我们自定义的异常通常继承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进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。