Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 625|回复: 0

.NET中异常类(Exception)

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-21 09:28:42 | 显示全部楼层 |阅读模式

      异常:程序在运行期间发生的错误。异常对象就是封装这些错误的对象。

      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 == 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);//在此处捕获所有的异常,并统一抛出去
                }
            }
        }
    }
    异常类实例

     

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

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-12-22 16:18 , Processed in 0.058508 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表