C# 程序调试和异常处理(try catch)

977 阅读6分钟

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

前言:

这是一篇值得你收藏的文章哦。我们在做窗体应用或者其他的程序的时候难免会遇到一些BUG,一些自己跑起来莫名其妙的效果,或者系统直接报异常,C#提供了功能强大的异常处理机制,用来对应用程序可能产生的错误或者其他会造成执行中止的异常情况进行处理,这篇文章我们一起学习一下,关于调试和异常处理的情况。好了,开始学习了。

每日一遍,学习使我进步

ceeb653ely1g1ws2e1kjjj20du0f7q8r

1.程序调试

1.1常见的错误

我们在开发中,程序调试是检查并验证它能够正常运行的有效方法。在编写程序难免遇到一些错误,为了解决错误我们需要对运行程序进行调试,查出错误的根源。常见的错误信息有以下三种:

1.编译错误:是指在程序在编译过程中出现的错误。常见的是语法错误,缺少括号分号之类的。

image-20211123185838398

2.逻辑错误:当应用程序未按照预期方式执行会产生逻辑错误。这种一般是语法没错,由于错误的算法引起,如结果不对,公式不对等。这种错误是最难的。

image-20211123190755532

3.运行错误:是指在程序运行期间执行了非法发操作或者莫些操作失败。如需要打开的文件找不到,内存泄漏,以零做除数这些异常只有在运行的时候才能表现。

image-20211123191359011

1.2.调试方法

我们在调试程序的时候经常使用的一种方法就是使用断点。我们在操作的时候:插入断点---》调试到断点----》删除断点。在使用断点的操作有三种快捷键:F11:逐语句操作,执行一行代码,F10:逐过程操作,执行一段代码,shift+F10:执行跳出操作

image-20211123193552328

2.异常的捕获和处理

异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:trycatchfinallythrow

//概念
try:一个 try 块标识了一个将被激活的特定的异常的代码块。后跟一个或多个 catch 块。
catch:程序通过异常处理程序捕获异常。catch 关键字表示异常的捕获。
finallyfinally 块用于执行给定的语句,不管异常是否被抛出都会执行。例如,如果您打开一个文件,不管是否出现异常文件都要被关闭。
throw:当问题出现时,程序抛出一个异常。使用 throw 关键字来完成。
//用法
try ... catch{//异常处理代码} 	//捕获异常,可以多个catch
try ... finally{ //用于消除try 块中分配的任何资源以及 运行任何即使在发生异常时也必须执行的代码} 	//清除异常
try ... catch ... finally 	// 处理所有异常,前面两个的结合
//需要抛出对象
如果异常是直接或间接派生自 System.Exception 类,您可以抛出一个对象。您可以在 catch 块中使用 throw 语句来抛出当前的对象,如下所示:
Catch(Exception e)
{
   ...
   Throw e
}

image-20211123200444916

2.1异常类了解

对一些常用的异常类了解,顺带把Exception的异常类全展示。

//常用的异常类
Exception:所有异常对象的基类。
SystemException:运行时产生的所有错误的基类。
IndexOutOfRangeException:当一个数组的下标超出范围时运行时引发。
NullReferenceException:当一个空对象被引用时运行时引发。
InvalidOperationException:当对方法的调用对对象的当前状态无效时,由某些方法引发。
ArgumentException:所有参数异常的基类。
ArgumentNullException:在参数为空(不允许)的情况下,由方法引发。
ArgumentOutOfRangeException:当参数不在一个给定范围之内时,由方法引发。
InteropException:目标在或发生在CLR外面环境中的异常的基类。
ComException:包含COM类的HRESULT信息的异常。
SEHException:封装Win32结构异常处理信息的异常。
SqlException:封装了SQL操作异常。
//其他Exception 类描述
SystemException 其他用户可处理的异常的基本类
ArgumentException 方法的参数是非法的
ArgumentNullException 一个空参数传递给方法,该方法不能接受该参数
ArgumentOutOfRangeException 参数值超出范围
ArithmeticException 出现算术上溢或者下溢
ArrayTypeMismatchException 试图在数组中存储错误类型的对象
BadImageFormatException 图形的格式错误
DivideByZeroException 除零异常
DllNotFoundException 找不到引用的DLL
FormatException 参数格式错误
IndexOutOfRangeException 数组索引超出范围
InvalidCastException 使用无效的类
InvalidOperationException 方法的调用时间错误
MethodAccessException 试图访问思友或者受保护的方法
MissingMemberException 访问一个无效版本的DLL
NotFiniteNumberException 对象不是一个有效的成员
NotSupportedException 调用的方法在类中没有实现
NullReferenceException 试图使用一个未分配的引用
OutOfMemoryException 内存空间不够
PlatformNotSupportedException 平台不支持某个特定属性时抛出该错误
StackOverflowException 堆栈溢出
Exception:所有异常对象的基类。
SystemException:运行时产生的所有错误的基类。
IndexOutOfRangeException:当一个数组的下标超出范围时运行时引发。
NullReferenceException:当一个空对象被引用时运行时引发。
InvalidOperationException:当对方法的调用对对象的当前状态无效时,由某些方法引发。
ArgumentException:所有参数异常的基类。
ArgumentNullException:在参数为空(不允许)的情况下,由方法引发。
ArgumentOutOfRangeException:当参数不在一个给定范围之内时,由方法引发。
InteropException:目标在或发生在CLR外面环境中的异常的基类。
ComException:包含COM类的HRESULT信息的异常。
SEHException:封装Win32结构异常处理信息的异常。
SqlException:封装了SQL操作异常。

2.2 自定义异常

在实际应用中,如果系统提供的异常类不能满足需求,我们就可以自己自定义异常,可以自己创建异常类。

image-20211123202110250

  class outException : ApplicationException//我们自定义的异常类继承Exception的派生类ApplicationException来完成的
    {
        string str;
        public outException():base()//定义构造函数
        {
            this.str = "我们不接受1这个数作为除数,IC00说的!";
            
        }
        public override string ToString()//重写一下Tostring
        {
            return str.ToString();
        }
    }

总结

调试是编写程序的重要步骤和手段,异常处理是避免应用程序出错,是一道防止程序出错的一道防火墙。我们在编写程序的时候调试这个技能是必不可少的,可以使我们的程序更加快速的查询和纠错,方便我们对程序的开发,学会这个技能可以帮助我们高质量的开发程序,好了,创作不易点赞关注评论收藏!!!好评哦。。。。

52011211