2019-2-21.NET中异常类(Exception)

.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 一个无效的统一资源标识符

注意:如果自己能判断的异常或者错误,就不要交由.net的异常处理机制。比如字符串转换成数字,应该在转换之前判断是否符合格式要求,而不是直接转换。

例子

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 == 101)//如果argument2值为101时,抛出参数无效的异常
                {
                    throw new ArgumentException("参数无效");
                }
                if (argument2 > 100)
                {
                    throw new ArgumentOutOfRangeException("参数超出了指定的范围");
                }
                if (!Directory.Exists("D:\\Test"))
                {
                    throw new DirectoryNotFoundException("该目录不存在");
                }
                if (argument2 == 0)
                {
                    throw new DivideByZeroException("分母不能为0");
                }
                int num = 10 / 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>() { "123", "456" };
                if (num > list.Count - 1)
                {
                    throw new IndexOutOfRangeException("索引超出了集合的范围");
                }
                string indexStr = list[num];
                Dictionary<int, string> dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "456" } };
                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);//在此处捕获所有的异常,并统一抛出去
            }
        }
    }
}

异常类实例

  

原文地址:https://www.cnblogs.com/liuqifeng/p/10412705.html

时间: 2024-08-06 11:59:47

2019-2-21.NET中异常类(Exception)的相关文章

java中异常类与类别

异常类的层次结构: 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出).Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性,它们都在java.lang包下面. Error类标记了严重错误,类似内存溢出,虚拟机异常,等等,是不该出现的.这些错误表示故障发生于虚拟机自身.或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError).类定义错误(NoClassDefFoundError)等.这些错

借助backtrace和demangle实现异常类Exception

C++的异常类是没有栈痕迹的,如果需要获取栈痕迹,需要使用以下函数: #include <execinfo.h> int backtrace(void **buffer, int size); char **backtrace_symbols(void *const *buffer, int size); void backtrace_symbols_fd(void *const *buffer, int size, int fd); backtrace将当前程序的调用信息存储在buffer中

java中异常(Exception)的定义,意义和用法。举例

1.异常(Exception)的定义,意义和用法 (视频下载) (全部书籍) 我们先给出一个例子,看看异常有什么用? 例:1.1-本章源码 public class Test {    public static void main(String[] args) {        int userInput=0;        int I = 6 / userInput;        System.out.println("马克-to-win:优雅结束");    }} 输出结果:

异常类Exception

Exception.h 1 #ifndef EXCEPTION_H 2 #define EXCEPTION_H 3 #include <string> 4 #include <exception> 5 6 7 class Exception : public std::exception 8 { 9 public: 10 explicit Exception(const char *what); 11 explicit Exception(const std::string &am

转:Java中Error与Exception的区别

Error类和Exception类都继承自Throwable类. Error的继承关系: Exception的继承关系: 二者的不同之处: Exception: 1.可以是可被控制(checked) 或不可控制的(unchecked). 2.表示一个由程序员导致的错误. 3.应该在应用程序级被处理. Error: 1.总是不可控制的(unchecked). 2.经常用来用于表示系统错误或低层资源的错误. 3.如何可能的话,应该在系统级被捕捉. Java 中定义了两类异常: 1) Checked

java中常见的异常类

1. java.lang.nullpointerexception   这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片未经初始化,或者图片创建时的路径错误等等.对数组操作中出现空指针,很多情况下是一些刚开始学习编程的朋友常犯的错误,即把数组的初始化和数组元素的初始化混淆起来了.数组的初始化是对数组分配需要的空间,而初始化后的数组,其中的元素并没有实例化,依然是空

每天一点儿java---继承exception类来实现自己的异常类

package prac_1; /** * <p>Title: 捕获异常和实现自己的异常类</p> * <p>Description: 通过继承Exception类来实现自己的异常类.并使用try-catch来捕获这个异常.</p> * <p>Copyright: Copyright (c) 2014</p> * <p>Filename: </p> * @author 王海涛 * @version 0.1 */

C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析与解决方法

对于C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析,目前本人分析两种情况,如下: 情况一: 借鉴麒麟.NET的类型初始值设定项引发异常文章!!!写的很详细,大家可以看一看! 其实麒麟.NET的这篇文章主要讲解分析了静态成员的方面,总的说就是:类型初始化或访问类型的静态成员时,都会对类中的其他静态成员进行初始化,如果有静态构造函数的话,一并执行静态构造函数.在这过程中所引发的异常我就直接借鉴麒麟.NET的例

MVC中异常: An exception of type &#39;System.Data.ProviderIncompatibleException&#39; occurred in EntityFramework.dll的一种解决办法

今天在调试MVC的例子的时候,总是出错(An exception of type 'System.Data.ProviderIncompatibleException' occurred in EntityFramework.dll but was not handled in user code).在这里报Exception.我改了好久connectionString,还是不能解决问题. public ActionResult Index()        {            retur