优秀的编程知识分享平台

网站首页 > 技术文章 正文

C#之异常处理(c#中什么是异常)

nanyue 2024-07-19 23:57:09 技术文章 38 ℃

使用try-catch-finally异常处理。try中写可能出现异常的代码,如果出现异常,处理异常部分在catch,finally执行无论是否异常都执行的代码,比如非托管资源释放等。

try

当程序可能出现异常时,我们希望程序经过一些处理仍旧正常跑起来,可能出现异常的代码可以写在这里,一个try至少关联一个catch或者finally。

catch

可以有多个catch处理异常,出现异常时,第一个合适的catch将来处理,所以具体的异常一般写在前面,如果写在后面将会被前面的catch覆盖了。

        static void Main(string[] args)
        {
            try
            {
                int num1 = 0;
                int num2 = 10 / num1;
            }
            catch (DivideByZeroException e)
            {
                Console.WriteLine("尝试除以零的异常...");
                Console.ReadKey();
            }
            catch
            {
                Console.WriteLine("其他异常...");
                Console.ReadKey();
            }
        }

上面代码异常会被DivideByZeroException捕捉到,当然,如果不指定DivideByZeroException异常,会被System.Exception捕捉。当具体的异常类型写在后面的catch中,不指定类型的catch写在前面,会产生编译错误。

如果catch里面代码又出现异常了,在这里程序将会终止。

        static void Main(string[] args)
        {
            try
            {
                throw new DivideByZeroException();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                throw new Exception();
            }
            finally
            {
                Console.WriteLine("无论是否有异常都执行");
                Console.ReadKey();
            }
        }

为了让程序更加健壮,catch里如果选择将异常信息记录日志的话,如果throw再次抛出,则上层代码会知道这个异常,然后可能出现异常的代码通过修正将会更安全,当然这个按需求来。catch里面也可以什么都没有,此时出现了异常也无从而知,一般这种做法没有多少人会采取吧,因为这样只是让程序看起来很“完美”罢了。

finally

在try/catch之后加入finally,无论是否发生异常都会执行finally的代码。

结构化异常处理

Exception类的StackTrace记录了异常时调用的方法,以及一直递归到最上层的方法都有,这对调试非常有用,Message的信息也很有用。如果我们抛出异常仅仅是Exception而不是具体的异常,则没有具体类型的Message信息多,对调试可能不太友好,我们应该尽量抛出具体类型的异常。

        static void Main(string[] args)
        {
            try
            {
                throw new DivideByZeroException();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                Console.WriteLine("this is finally");
            }
            Console.ReadKey();
        }
最近发表
标签列表