一、异常的层次结构

二、异常格式

异常的一般格式

try
{
//可能会抛出异常的代码
}
catch
{
//发现错误后会运行这里面的代码
}
finally
{
//写不论是否出现异常都执行的代码
}

格式变体

(1)可以省略finally

try
{
//可能会抛出异常的代码
}
catch
{
//发现错误后会运行这里面的代码
}

(2)可以有多个catch

每个catch块之间是有顺序的,子类必须写在父类之前,不然无法编译过

            try
{
...
}
catch (System.ServiceModel.EndpointNotFoundException)
{
Console.WriteLine("由于目标计算机积极拒绝,无法连接!");
}
catch (Exception ex)
{
Console.WriteLine("["+DateTime.Now.ToString()+"] - "+ ex.Message);
}

(3)不包含catch

try
{
//可能会抛出异常的代码
}
finally
{
//写不论是否出现异常都执行的代码
}

这种方式不是用来判断异常,而是一钟确保try后执行finally的方式,如果try中有几个出口,这很有用

(4)嵌套try

异常处理可以互相嵌套,在内层找不到对应的处理代码,会向外层找。

而且具MSDN的说法“很多情况下,异常可能不是由代码直接调用的方法引发,而是由调用堆栈中位置更靠下的另一个方法所引发。 在这种情况下,CLR 将展开堆栈,查找是否有方法包含针对该特定异常类型的 catch 块,如果找到这样的方法,就会执行找到的第一个这样的 catch 块。 如果在调用堆栈中的任何位置都没有找到适当的 catch 块,就会终止该进程,并向用户显示一条消息。

static void Main(string[] args)

          {

              int n1 = ;

              int n2 = ;

              int result;

              try
{
try
{
result = n1 / n2;
Console.WriteLine("{0}", result);
}
catch (MemberAccessException e)
{
Console.WriteLine(e.Message);
}
finally
{
Console.WriteLine("finally1");
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
Console.WriteLine("finally2");
}
Console.ReadKey();
}

三、Exception

e.ToString() 和 e.Message 的区别

e.ToString()获取的信息包括异常类型和异常详细消息,而e.Message 只是获取了异常的详细消息字符串。

四、throw

throw就是用来抛出异常的,
 一个方法 A 中,使用throw语句抛出了一个异常,则调用了 A 方法的地方,必须进行捕捉,或者继续抛出,一直到 main方法,如果main方法也没有进行捕捉,系统则崩溃。
系统碰到没有捕捉的异常,立刻停止,你的弹出对话框的语句,在throw语句的后面,throw语句一执行,调用 A 方法的地方,立刻捕捉到了这个异常,并进行处理,throw后面的语句将不会执行。

throw new Exception(e.Message);
throw new Exception("自定义错误信息");

向上传递异常可以只使用throw,但不创建对象,表示抛出catch块的当前异常

catch
{
throw;
}

五、自定义异常

六、异常过滤器  --C# 6以后

新增 when条件

            try
{
}
catch (WebException e) when (e.Status == WebExceptionStatus.Timeout)
{
}
catch (WebException e) when (e.Status == WebExceptionStatus.ConnectFailure)
{
}

七、throw表达式 -- C# 7以后

throw以前只是单独的句子

现在可以是

        static void Main(string[] args)
{
argumentExp();
}
public static int argumentExp() =>throw new ArgumentException();

(34)C#异常的更多相关文章

  1. 《python学习手册》第34章 异常对象

    基于字符串的异常 python在2.6之前可以使用字符串来定义异常,并且是通过对象标识符来匹配的(即通过is 而不是==) myexc = "My excetion string" ...

  2. Python学习 Part6:错误和异常

    Python学习 Part6:错误和异常 两种不同类型的错误:语法错误和异常 1. 语法错误 语法错误,也被称作解析错误: >>> while True print('Hello w ...

  3. C++异常之四 异常类型的生命周期

    异常类型的生命周期 1. throw 基本类型: int.float.char 这三种类型的抛出和函数的返回传值类似,为参数拷贝的值传递. 1 int test_1(int num) throw (i ...

  4. java入门之从C#快速入门java

    可变参数: Void sum(int…list){}以“…”三个字为关键字 可变参数:以params为关键字 34 对异常的描述: java中,异常分为两种,运行时异常(也就是uncheckExcep ...

  5. 程序员修炼之道中所有tips总结

    1         关心你的技艺 如果你不在乎能否漂亮地开发出软件,你又为何要耗费生命去开发软件呢? 2         思考!你的工作 关掉自动驾驶仪,接管操作.不断地批评和评估你的工作. 3    ...

  6. C++知识点 笔试常见

    C++知识点   一.#include “filename.h”和#include <filename.h>的区别 #include “filename.h”是指编译器将从当前工作目录上开 ...

  7. volley源码解析-Throwable类源码解析

    前提知识点: 1.Serializable接口 作用:表示可序列化的语义.就是Java提供的通用数据保存和读取接口.任何类型实现了Serializeable接口,就可以被保存到文件中,或者作为数据流通 ...

  8. 多线程 共享资源 同步锁 java

    Java多线程编程:Lock   synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 如果一个代码块被synchronized修饰了,当一 ...

  9. python服务端工程师就业面试指导☝☝☝

    python服务端工程师就业面试指导 由Python专业面试官打造的课,少之又少,专业代表着经验,代表着对考察点的通透理解,更代表着对你负责 第1章 Python工程师offer直通车(视频+教辅文档 ...

随机推荐

  1. 数组去重Set也可实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. SQL Server 获取所有库名

    ----1. 获取所有的数据库名----- SELECT NAME FROM MASTER.DBO.SYSDATABASES ORDER BY NAME   -----2. 获取所有的表名------ ...

  3. 取对数求阶乘位数——lightoj1045

    /* 求 n! 在base进制下的位数 取对数,用换底公式,预处理对数前缀和 b^x = n! x = log_b(n!) = log_10(n!)/log_10(b) 对x向上取整即可 */ #in ...

  4. C++之判断字符串是否是数字

    文章转载自https://blog.csdn.net/Richard__Ting/article/details/80772174 判断是否为数字 #include <iostream> ...

  5. NX二次开发-NXOPEN设置工程图表格注释字体workPart->Fonts()->AddFont("chinesef_fs", NXOpen::FontCollection::TypeNx);

    NX9+VS2012 #include <uf.h> #include <uf_tabnot.h> #include <NXOpen/Part.hxx> #incl ...

  6. [Android开发常见问题-4] RunTime.exec()如何以root权限执行多条指令?

    转:http://blog.csdn.net/alexander_xfl/article/details/9150971 RunTime.exec()这个接口可以说是给我们开发者提供了一个很好的直观操 ...

  7. nginx启停脚本

    安装nginx时,源码包中未带官方的启动脚本,也就无法使用service nginxd start这种启动方式,查了下资料自己写了一个: #!/bin/bash #@version: #@author ...

  8. 面试总结【css篇】- css3新增特性

    1.css3中的关键帧 @keyframes规则通过在动画序列中定义关键帧(或waypoints)的样式来控制CSS动画序列中的中间步骤.这 比转换更能控制动画序列的中间步骤. @keyframes ...

  9. cors是什么?django中怎么解决这个问题?

    跨域资源共享(CORS) 是一种机制. 当一个资源从与该资源本身所在的服务器不同的域.协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求.(CORS是一种可以让你实现跨站点请求并同时阻止恶意 ...

  10. WebApi的Swagger多版本控制实现

    WebApi + Swagger2.0接口文档多版本控制设计实现 最近前后端分离的项目越来越多,API的对接对于前后端开发交流得最多的一块内容,一个好的API文档生成工具就显得非常重要,选取了Swag ...