首页 > 编程语言 >C#准确抛出异常错误位置

C#准确抛出异常错误位置

时间:2023-01-01 21:44:31浏览次数:48  
标签:Exception C# 抛出 try int Form1 ex public 准确

上一年,为了最大程度减小影响,提得最多的词是 "精准防控"。程序异常处理也要做到精准,这样才能节约排查时间,降低分析难度,快速解决问题。我们经常使用try-catch捕捉异常,使用StackTrace来输出具体位置。但在复杂的框架和业务系统中,要注意它的使用方式。下面分别以不同的实例来说明问题。

一、单层捕捉异常

业务逻辑非常简单,代码只有一层(不切实际的想象)。

using System;
using System.Windows.Forms;
namespace ExceptionTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                int a = 10;
                int b = 0;
                Console.WriteLine(a / b);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
   }
}

  使用try-catch能轻松捕捉异常位置:17行的b为0,不能当作除数!

二、外层捕捉异常,内层不处理(可用)

实际项目中,往往是对象调用、函数嵌套,为了简便(偷懒),我们在最外层加try-catch,里面不做任何处理。

using System;
using System.Windows.Forms;
namespace ExceptionTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                int a = 10;
                int b = 0;
                Divide(a, b);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        public static void Divide(int a,int b)
        {
            Console.WriteLine(a / b);
        }
    }
}

结果也能居然也能定位,这难道就是"无为而治"吗?

三、外层捕捉异常,内部抛出

为了彰显我们有良好的代码习惯,得在内层函数加个try,显得更复杂,似乎才能体现出"水平"。

using System;
using System.Windows.Forms;
namespace ExceptionTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                int a = 10;
                int b = 0;
                Divide(a, b);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        public static void Divide(int a, int b)
        {
            try
            {
                Console.WriteLine(a / b);
            }
            catch (Exception ex)
            {
                throw;
            }
        }
    }
}

结果无法准确定位到29行,而变成了throw所在33行。

四、外层捕捉异常,内层抛出异常

再尝试抛出throw ex看看。

using System;
using System.Windows.Forms;
namespace ExceptionTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                int a = 10;
                int b = 0;
                Divide(a, b);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        public static void Divide(int a, int b)
        {
            try
            {
                Console.WriteLine(a / b);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}

结果还是不能定位。多此一举?

五、外层捕捉异常,内层抛出新异常

 在内层抛出一个新异常。

using System;
using System.Windows.Forms;
namespace ExceptionTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                int a = 10;
                int b = 0;
                Divide(a, b);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        public static void Divide(int a, int b)
        {
            try
            {
                Console.WriteLine(a / b);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
}
这是最容易犯的问题,这样就妥妥找不到出错的位置了!

六、外层捕捉异常,内层抛出内部异常(推荐)

我们内层抛出new Exception(且包含内部异常),而不是直接抛出Exception

using System;
using System.Windows.Forms;
namespace ExceptionTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                int a = 10;
                int b = 0;
                Divide(a, b);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
        public static void Divide(int a, int b)
        {
            try
            {
                Console.WriteLine(a / b);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message,ex);
            }
        }
    }
}

这是我们想要的,每个需要处理异常的函数都需使用 new Exception(且包含内部异常),每个不需要处理异常的函数做也不需要做

标签:Exception,C#,抛出,try,int,Form1,ex,public,准确
From: https://www.cnblogs.com/liweis/p/17018667.html

相关文章

  • HHUACM2023寒假集训(低年级组)信息汇总
    第一周(1.2-1.8):基础算法题单链接:低年级组集训第一周:基础算法(一),低年级组集训第一周:基础算法(二)第二周(1.9-1.15):简单数学TODO第三周(1.16-1.22):数据结构基础TODO......
  • WCF 服务容器化的一些问题
    背景目前项目当中存有.NETFramework和.NETCore两种类型的项目,但是都需要进行容器化将其分别部署在Windows集群和Linux集群当中。在WCF进行容器化的时候,遇到了......
  • Leetcode[6279]. 数组乘积中的不同质因数数目
    1.题目给你一个正整数数组 nums ,对 nums 所有元素求积之后,找出并返回乘积中 不同质因数 的数目。注意:质数 是指大于 1 且仅能被 1 及自身整除的数字。如果......
  • Office三件套批量转PDF以及PDF书签读写与加水印
    日常工作中,我们经常需要将office三件套,Word、Excel和PPT转换成PDF。当然办公软件自身都带有这样的功能,但当我们需要一次性转换大量的office文件时,用代码就比较方便。其实这......
  • 理解C#泛型原理
    前言 我们都知道泛型在C#的重要性,泛型是OOP语言中三大特征的多态的最重要的体现,几乎泛型撑起了整个.NET框架,在讲泛型之前,我们可以抛出一个问题,我们现在需要一个可扩容的数......
  • sccache 基于rust 类似ccache 的编译cache 工具
    sccache类似ccache的编译cache工具,支持基于本地磁盘,或者云对象存储特性基于c/c++,rust编译支持增量编译rust集成使用可以通过定义build.rustc-wrapper,基于......
  • 1.1 vp Codeforces Round #837 (Div. 2)
    A-HossamandCombinatorics题意:给出数组a,求数组中aj-ai==max(a)-min(a)的(i,j)对数思路:将a数组排序,极差只可能等于最大值减最小值,也就是对数跟最大值和最小值......
  • Codeforces 204 A. Pride 做题记录
    原题链接:https://codeforces.com/problemset/problem/204/A一开始还很若智地宕机了一下,想清楚了就很明白。很显然在不考虑首尾的情况下,题目要求的数字会以$10$为......
  • delphi 关于ComBoBox控件用代码设置值时,onchange事件失效的解决方案
    问题表现为:手动设置里一点问题也没有,值和颜色都能正常显示,但是通过代码操作时,onchange事件并没有被触发.  解决方案是让它主动触发:ComArr是个全局TList,窗体......
  • osv-scanner google 开源漏洞扫描工具
    osv-scanner是google基于golang编写的开源漏洞扫描工具,支持基于osv数据库的扫描,生态比较好支持的扫描模式lockfilessbomsgit项目说明osv-scanner支持的扫描......