异常处理 Exception

一、异常类

1、在C#中所有的异常都是使用一个异常类型的示例对象表示的,这些异常类型都是继承自System.Exception类型,或者直接使用System.Exception类型的实例对象;

2、在C#中,位于finally块中的代码可以保证不管代码是正常结束,还是进入异常处理代码块,其中的语句均会被执行。

System.Exception类有一些属性值得注意,这些属性被所有从此类派生的异常类共享,这些属性是:

  Message:一个只读字符串,此属性为当前的异常提供了描述性信息;

  InnerException:一个Exception类型的只读属性,如果它的值不为null,则可以通过它的值获取导致当前异常的异常实例;反之,如果其值为null,则表示当前异常不是由其他异常引发的。

  StackTrace:一个只读字符串,此属性描述了异常发生时调用堆栈的内容,其中首先显示最近的方法调用。

二、抛出异常

  当程序有错误的时候可以创建一个描述该错误的异常对象,然后用throw关键字抛出异常对象,抛出的异常对象将被当前代码的更上层代码所捕获,或者不处理直接抛出,或者干脆不予捕获。那么该异常将一直向上传递,直到有人捕获并处理它。

    class Program
    {
        static void Main(string[] args)
        {
            DoSomething(null);

            Console.ReadKey();
        }

        public static void DoSomething(string name)
        {
            if (name == null)
            {
                throw new ArgumentException("参数不能为空!");
            }
        }
    }

三、捕获异常

  可以使用try/catch来捕获并选择是否处理异常,捕获了异常并非一定要处理异常,还可以将异常转换为另一个异常后再抛出,或者仅仅是记录异常的信息。

  要记住,始终必须按照从最特定到最不特定(从具体到一般)的顺序对catch块中处理的异常进行排序,这个原则可以保证在将某个特定异常传递给更一般的异常的catch块之前处理该异常。

  try/catch块有三种形式:try-catch、try-finally、try-catch-finally,不带有catch或finally块的try语句将导致编译器错误。

  try语句中的代码是可能抛出异常的代码,catch块捕捉某种特定的异常并加以处理。这些catch块可以有多个,并且catch块可以串联在一起,如果存在多个catch块,那么计算顺序是从顶部到底部。但是对于所引发的每个异常,都只执行一个catch块。

  1、好的编程的做法是捕获特定类型的异常,而不是捕获更常规的异常。

  2、如果捕获特定类型的catch块捕获异常的基类型catch块同时存在,则前者要位于后者之前,否则将无法通过编译。

    class Program
    {
        static void Main(string[] args)
        {
            DoSomething(null);

            Console.ReadKey();
        }

        public static void DoSomething(string name)
        {

            try
            {
                Console.WriteLine(name);
                if (name == null)
                {
                    throw new ArgumentException("参数不能为空!");
                }
            }
            catch (ArgumentException ex)
            {
                name = "你好";
                DoSomething(name);
                Console.WriteLine(ex.Message);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {

            }
        }
    }

四、自定义的异常类

  要创建用户自定义异常类,需要遵循以下几点

  1、从System.ApplicationException或者System.Exception类派生。

  2、使用"Exception"这个词作为自定义的异常名称的后缀。

  3、至少提供三个公共函数。

  4、一个不包含参数的默认构造函数。

  5、一个可以包含异常消息的构造函数,只有一个参数:message。

  6、一个可以包含异常消息,以及引发该异常的异常引用的构造函数,这两个参数分别是message和innerException。

    public class OneException : System.ApplicationException
    {
        public OneException() { }
        public OneException(string message) : base(message){}
        public OneException(string message,System.Exception innerException) : base(message,innerException){}
    }

五、异常处理原则

  1、尽量由程序自动处理异常。当异常发生时,程序在捕获后应该先尝试处理异常,如果错误得以排序,那么程序可以恢复正常,而不是每次捕获异常就立刻通知用户来处理,或者仅仅把异常信息记录下来。例如网络传送发生连接错误,应该先重连几次,然后再通知用户处理。

  2、限制异常范围,应该尽量地减少缩小异常处理的范围,如果只需要检测某一行代码可能发生异常,就不要把整段的代码都放进try语句块中。

  3、应该捕获更具体的异常。尽量避免直接捕获Exception异常。

  4、尽可能在上层捕获并处理异常。

  5、应该将异常信息保存在日志中。

突然回忆起上次面试的一段代码:

    class Program
    {
        static void Main(string[] args)
        {
            string name = GetName();
            Console.WriteLine(name);  //输出 就算return了这行也会执行哦!
                       //输出 你好
            Console.ReadKey();
        }

        public static string GetName()
        {
            try
            {
                return "你好";
            }
            catch (Exception ex)
            {
                return "捕捉到异常!";
            }
            finally
            {
                Console.WriteLine("就算return了这行也会执行哦!");
            }
        }
    }

  留意到,几时是没抛出异常同时return了也执行了finally里面的代码。

时间: 2024-11-07 10:42:52

异常处理 Exception的相关文章

ORACLE PL/SQL异常处理(Exception)学习笔记

1.PL/SQL错误类型 错误类型 报告者 处理方法 编译时错误 PL/SQL编译器 交互式地处理:编译器报告错误,你必须更正这些错误 运行时错误 PL/SQL运行时引擎 程序化地处理:异常由异常处理子程序引发并进行捕获 2.异常的声明 有两种异常:用户自定义异常和预定义异常 用户自定义异常就是由程序员自己定义的一个错误.该错误还不是非常重要,所以并没有将整个错误包含在Oracle的错误中.例如,它可能是一个与数据有关的错误.而预定义异常则对应于一般的SQL和PL/SQL错误. 用户自定义异常是

C#中的异常处理(Exception Process in C#)

不要抛出"new Exception()"–>抽象的异常往往让人迷惑 不要只记录Exception.Message的值,还需要记录Exception.ToString()–>Exception.ToString()包含"堆栈跟踪"信息 catch要捕捉具体异常–>好的代码只捕捉知道的异常 using使用–>异常发生时,using能放在资源泄露 新异常应将原始异常作为其内部异常 catch抛出新异常会导致call stack丢失–>不处理

C++、Java、JavaScript中的异常处理(Exception)

编程思想之异常处理 什么叫异常处理? 什么叫异常(Exception)?顾名思义就是非正常的情况,出现了不希望出现的意外,异常处理就是遇到这种意外时准备的对策和解决方案.比如您开着一辆劳斯莱斯在公路上行走,突然前面出现一个小孩,幸好您眼疾手快紧急刹车,而避免了一场交通事故.在这个例子中突然出现的小孩就是异常,紧急刹车就是异常处理(面对这种突发情况采取的解决方案). 程序来源于现实,是现实的抽象和模拟,也会有异常,因此异常的处理就显示的极为重要.试想如果您的手机的某个应用使用两下就崩溃了,或都出现

java异常处理Exception

我看别人的面经中有一道题目就问到了Exception,即java的异常处理的,我以前也学了java的异常处理,但是我查了下,看了别人的博客关于写的exception异常处理,我发现,自己学的不牢固,只学到了一点皮毛而已,在看了那么多博客和资料后,我做下总结吧,不然我大脑都混乱了. java的中异常祖先是Throwable,Throwable的直接子类是Exception和Error. Error通过单词我们就知道,是错误的意思,这种错误一般是jvm运行产生的错误,出现这种错误,我们的程序不能解决

Akka(26): Stream:异常处理-Exception handling

akka-stream是基于Actor模式的,所以也继承了Actor模式的“坚韧性(resilient)”特点,在任何异常情况下都有某种整体统一的异常处理策略和具体实施方式.在akka-stream的官方文件中都有详细的说明和示范例子.我们在这篇讨论里也没有什么更好的想法和范例,也只能略做一些字面翻译和分析理解的事了.下面列出了akka-stream处理异常的一些实用方法: 1.recover:这是一个函数,发出数据流最后一个元素然后根据上游发生的异常终止当前数据流 2.recoverWithR

zbb20170601 oracle PL/SQL 语句块 游标 自定义游标 异常处理EXCEPTION

--打开日志输出 set serverout on -- PL/SQL 语句块: -- 声明部分 declare v_i number; v_sum number:=0; -- 执行部分 begin v_i := 1; -- 简单loop循环 loop v_sum:=v_sum+v_i; v_i:=v_i+1; if v_i>100 then exit;-- 跳出循环 end if; end loop; dbms_output.put_line(v_sum); -- 异常处理部分 end; --

Php 异常处理 exception

<?php $a = null; //没有接收一场处理 if($a == 0) { throw new DbException('val is empty'); } exit(); // 接收异常并处理 try { if($a == 0) { throw new DbException('val is empty'); } } catch (DbException $e) { echo $e->showMessage(); //输出异常信息. } // 记录异常,定义不同类型异常处理 clas

PHP的错误和异常处理

PHP的错误和异常处理 任何程序员在开发时都可能遇到过一些失误,或其他原因造成错误的发生.当然,用户如果不愿意或不遵循应用程序的约束,也会在使用时引起一些错误发生.PHP程序的错误发生一般归属于下列三个领域. Ø  语法错误 语法错误最常见,并且最容易修复.例如,遗漏了一个分号,就会显示错误信息.这类错误会阻止脚本执行.通常发生在程序开发时,可以通过错误报告进行修复,再重新运行. Ø  运行时错误 这种错误一般不会阻止PHP脚本的运行,但是会阻止脚本做希望它所做的任何事情.例如,在调用heade

Oracle 学习笔记 17 -- 异常处理(PL/SQL)

程序在执行过程中出现异常是正常的,在程序的编写过程中出现异常也是不可避免的.但是要有相应的异常处理的机 制,来保证程序的正常执行.PL/SQL程序执行过程中出现的错误,称为异常.一个优秀的程序都应该能够正确处理 各种出错的情况,并尽可能的从错误中恢复.PL/SQL提供了异常处理机制. 概念: 异常处理(exception)是用来处理正常执行过程中未预料的事件,程序块的异常处理定义的错误和自定义的错误, 由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会异常的终止. 有三种类型的错误