.NET中异常类(Exception)
异常:程序在运行期间发生的错误。异常对象就是封装这些错误的对象。
try{}catch{}是非常重要的,捕获try程序块中所有发生的异常,如果没有捕获异常的话,程序运行的线程将会挂掉,更严重的是这些错误有可能会直接抛给用户,让用户看到。所以说在程序的最外层必须要有捕获异常的程序。这样至少确保程序的正常运行。还有一点就是,捕获异常之后需要记录下来,这样对于我们排查问题也是有帮助的。
什么情况下,不需要捕获异常呢?
1.发生此类错误的时候,就没必要执行之后的代码的时候,就可以抛出异常了。
2.在开发封装类,并且发生的错误需要让调用者知道的时候,就可以抛出异常了。
Exception类:
翻译自:https://msdn.microsoft.com/en-us/library/804f22sf(v=vs.110).aspx
构造函数:4个重载,Exception()、Exception(SerializationInfo, StreamingContext)、Exception(String)、Exception(String, Exception)。
Exception():创建一个异常的实例,异常实例中所有的字段都需要手动再加,初次创建都是默认值。
Exception(SerializationInfo, StreamingContext):暂时不懂。
Exception(String message):创建一个带有错误信息的异常实例。message表示异常信息。
Exception(String message, Exception ex):创建一个异常实例,并为该异常赋值错误信息,如果有内部异常,也一起传进去。如果没有内部异常就传输null。
属性
属性名 | 类型 | 解释 |
Data | IDictionary | 获取除了异常信息以外,自定义异常的键值对的集合 |
HelpLink | String | 获取或设置一个跟异常相关联的帮助文档的地址 |
HResult | int | 获取或设置一个特定异常的代码 |
InnerException | Exception | 获取当前异常内部的异常实例 |
Message | String | 获取异常的错误信息 |
Source | String | 获取或设置当前异常发生在那个应用程序中 |
StackTrace | String | Gets a string representation of the immediate frames on the call stack. |
TargetSite | MethodBase | 获取当前异常发生的方法 |
异常类实例方法:
Equals(Object object):确定object是否与当前的对象相等。
ToString():把Exception对象转换成字符串,按照指定的格式显示。对Object.ToString () 方法进行重写。
Finalize():允许用户在垃圾回收机制回收之前,释放资源或者清除操作行为。
GetBaseException():在被继承类重写时,返回一个异常或随后的多个异常。
GetHashCode():作为默认的散列函数。
GetType():返回当前实例运行时的类型。
MemberwiseClone():浅复制当前的对象。
常用的异常类型
异常类型 | 描述 |
ArgumentException | 方法中传进一个非空参数是无效的 |
ArgumentNullException | 方法中传进一个空参数 |
ArgumentOutOfRangeException | 传入的参数超出了有效值的范围 |
DirectoryNotFoundException | 找不到相关目录 |
DivideByZeroException | 分子或分母为0 |
DriverNotFoundException | 驱动无效或者找不到相关驱动 |
FileNotFoundException | 找不到相关文件(文件不存在) |
FormatException | 格式转换出错,一个类型转换到另外一个类型的时候,格式不一致 |
IndexOutOfRangeException | 索引超出集合的范围 |
InvalidOperationException | 当前操作对象的状态是无效的 |
KeyNotFoundException | 集合中并没有找到对应的键 |
NotImplementedException | 方法或操作没有被实现 |
NotSupportedException | 不支持该方法或操作 |
ObjectDisposedException | 在一个操作上执行一个对象时,发现该对象已经被处理了 |
OverFlowException | 在算法、内存操作,类型转换的时候发生内存溢出 |
PathTooLongException | 一个目录或者文件超出了系统定义的最大长度 |
PlatformNotSupportedException | 当前运行环境不支持该操作 |
RankException | 方法中传进了错误的数组维数 |
TimeoutException | 操作超时 |
UIFormatException | 一个无效的统一资源标识符 |
例子
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions; namespace TestBLL
{
public class ExceptionTest
{
public static void Option(string argument1, int argument2)
{
try
{
if (argument1 == null)
{
throw new ArgumentNullException("参数为空值");
}
string result = argument1;
if (argument2 == )//如果argument2值为101时,抛出参数无效的异常
{
throw new ArgumentException("参数无效");
}
if (argument2 > )
{
throw new ArgumentOutOfRangeException("参数超出了指定的范围");
}
if (!Directory.Exists("D:\\Test"))
{
throw new DirectoryNotFoundException("该目录不存在");
}
if (argument2 == )
{
throw new DivideByZeroException("分母不能为0");
}
int num = / argument2; string path = @"C:\WINDOWS\system32\drivers\UsbCamIF.sys"; //驱动的默认安装地址
if (!File.Exists(path))
{
throw new DriveNotFoundException("未找到相关驱动程序");
}
if (!File.Exists("D:\\Test\\test.txt"))
{
throw new FileNotFoundException("该文件路径不存在");
}
if (Regex.Match(argument1, "\\D").Success)//如果字符中存在非数字字符,在String类型转换成int类型的时候抛出异常
{
throw new FormatException("无法转换类型");
}
num = int.Parse(argument1);
List<string> list = new List<string>() { "", "" };
if (num > list.Count - )
{
throw new IndexOutOfRangeException("索引超出了集合的范围");
}
string indexStr = list[num];
Dictionary<int, string> dic = new Dictionary<int, string>() { { , "" }, { , "" } };
if (!dic.Keys.Contains(num))
{
throw new KeyNotFoundException("并为找到相应的键");
}
result = dic[num];
}
catch (Exception e)
{
e.HelpLink = "https://msdn.microsoft.com/en-us/library/system.exception(v=vs.110).aspx";
e.Source = "Test";
throw new Exception("方法中出现异常",e);//在此处捕获所有的异常,并统一抛出去
}
}
}
}
异常类实例
注意:如果自己能判断的异常或者错误,就不要交由.net的异常处理机制。比如字符串转换成数字,应该在转换之前判断是否符合格式要求,而不是直接转换。
.NET中异常类(Exception)的更多相关文章
- 2019-2-21.NET中异常类(Exception)
.NET中异常类(Exception) 异常:程序在运行期间发生的错误.异常对象就是封装这些错误的对象. try{}catch{}是非常重要的,捕获try程序块中所有发生的异常,如果没有捕获异常的话, ...
- 【转】【C#】异常类 Exception 枚举所有类型的异常
一.基础 在C# 里,异常处理就是C# 为处理错误情况提供的一种机制.它为每种错误情况提供了定制的处理方式,并且把标识错误的代码与处理错误的代码分离开来. 对.NET类来说,一般的 异常类System ...
- C++异常第二篇---C++标准库异常类exception的使用
1 继承图示 2 具体讲解 C++标准库异常类继承层次中的根类为exception,其定义在exception头文件中,它是C++标准库所有函数抛出异常的基类,exception的接口定义如下: na ...
- 借助backtrace和demangle实现异常类Exception
C++的异常类是没有栈痕迹的,如果需要获取栈痕迹,需要使用以下函数: #include <execinfo.h> int backtrace(void **buffer, int size ...
- java中异常(Exception)的定义,意义和用法。举例
1.异常(Exception)的定义,意义和用法 我们先给出一个例子,看看异常有什么用? 例:1.1- public class Test { public static void main(S ...
- java 中异常类
算术异常类:ArithmeticExecption 空指针异常类:NullPointerException 类型强制转换异常:ClassCastException 数组负下标异常:NegativeAr ...
- 异常类Exception(String message, Throwable cause)中的cause理解
这个在构造函数里面竟然有一个Throwable,感觉有些奇怪. 1. Throwable cause 这里cause要传一个Throwable的子类异常进去么? 是引起这个异常的异常,如果这个值是空值 ...
- java中Error与Exception有什么区别
Error类和Exception类都继承自Throwable类. Error的继承关系: java.lang.Object java.lang.Throwable java.lang.Er ...
- C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析与解决方法
对于C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析,目前本人分析两种情况,如下: 情况一: 借鉴麒麟.NET ...
随机推荐
- C#和Python 图片和base64的互转
C#实例代码: /// <summary> /// 图片转base64 /// </summary> /// <param name="bmp"> ...
- Java中的变量传递机制以及JS中的参数传递机制
JAVA: 传递基本类型是 就是基本的值传递 不会影响值本身. package com.wuqi.p1; public class ValuePassTest { public static void ...
- 发布一个npm包
前言 我这里是写了一个vue轮播图插件,因此我使用了vue的脚手架工具创建一个项目,当然你也可以选择自己搭建脚手架. 本例中我会使用vue脚手架创建一个项目,并发布到npm上面去. 通过脚手架创建项目 ...
- git 修改远程仓库源
自己已经写好了一个项目,想上传到 github github 创建新项目 新建 README.md , LICENSE 本地项目添加 github 远程仓库源 不是git项目 git remote a ...
- 全网排名第一的免费开源ERP Odoo Git源代码部署教程
文/开源智造联合创始人老杨 本文来自<开源自主OdooERP部署架构指南>试读:第三章-Git源代码部署 .书籍尚未出版,请勿转载.欢迎您反馈阅读意见. 我们将从git源代码部署Odoo ...
- CTS/APIO后文化课游记
根据ghj1222的尿性,干什么事都要写一个游记划水记啥的...然后就写嘛... 现在是5.30微机课,先开个坑,学校6.5放假,我将于6.5后开始更新本文 APIO回来后发生的事真的特别多...有的 ...
- gitlab web客户端的使用
3.2.1 新建项目 3.2.2 初始化项目(git init) 正如上图显示的,gitlab会给我们相应的命令供我们使用(需要安装客户端).初始化一个项目可以是一个新建的空项目,也可以是一个已经存在 ...
- php类内方法使用类外变量和类外函数
如果要调用另一个类的属性和方法,直接实例化后调用就可以 但是要使用的变量和函数是独立的,不在本类或其他类里面,这时调用就要用下面的方法(本例是在同一个php文件里,如果不再同一个类文件可以requir ...
- Git练习1
- Java start和run启动线程的区别
我们知道,我们通过调用线程的start方法启动一个线程,那么,我们可以直接调用run方法来启动一个线程吗? 先看下面一段代码: public class Test { public static vo ...