C# 语言的异常处理功能有助于处理在程序运行期间发生的任何意外或异常情况。 异常处理功能使用 try、catch 和 finally 关键字来尝试执行可能失败的操作、在你确定合理的情况下处理故障,以及在事后清除资源。 公共语言运行时 (CLR)、.NET/第三方库或应用程序代码都可生成异常。 异常是使用 throw 关键字创建而成。
public class MyException
{
public static double divs(double a,double b)
{
if (b==0)
{
//抛出除数为0的异常
throw new DivideByZeroException();
}
return a / b;
}
}
static void Main(string[] args)
{
//捕获异常: 若不捕获异常,程序将直接崩溃
try
{
double result=MyException.divs(6, 0);
Console.WriteLine(result);
}
catch (DivideByZeroException)
{
Console.WriteLine("除数不能为0");
}
Console.ReadLine();
}
异常概述
异常具有以下属性:
- 异常是最终全都派生自 System.Exception 的类型。
- 在可能抛出异常的语句周围使用 try 代码块。
- 在 try 代码块中出现异常后,控制流会跳转到调用堆栈中任意位置上的首个相关异常处理程序。 在 C# 中,catch 关键字用于定义异常处理程序。
- 如果给定的异常没有对应的异常处理程序,那么程序会停止执行,并显示错误消息。
- 除非可以处理异常并让应用程序一直处于已知状态,否则不捕获异常。 如果捕获 System.Exception,使用 catch 代码块末尾的 throw 关键字重新抛出异常。
- 如果 catch 代码块定义异常变量,可以用它来详细了解所发生的异常类型。
- 使用 throw 关键字,程序可以显式生成异常。
- 异常对象包含错误详细信息,如调用堆栈的状态和错误的文本说明。
- 即使引发异常,finally 代码块中的代码仍会执行。 使用 finally 代码块可释放资源。例如,关闭在 try 代码块中打开的任何流或文件。
- .NET 中的托管异常在 Win32 结构化异常处理机制的基础之上实现。
//捕获系统提供的异常
public class MyException
{
public static double divs(double a,double b)
{
if (b==0)
{
//抛出除数为0的异常
throw new DivideByZeroException();
}
return a / b;
}
}
//自定义异常
class CustomException:Exception
{
public CustomException(string mes) { }
}
public class ExceptionTest
{
public void etest()
{
//抛出自定义的异常
throw new CustomException("这是一个自定义的错误!");
}
}
static void Main(string[] args)
{
//捕获异常: 若不捕获异常,程序将直接崩溃
try
{
//里面包含系统异常
double result=MyException.divs(6, 0);
Console.WriteLine(result);
//里面包含自定义异常
ExceptionTest et = new ExceptionTest();
et.etest();
}
//捕获系统已有异常
catch (DivideByZeroException)
{
Console.WriteLine("除数不能为0");
}
//捕获自定义异常
catch (CustomException ct)
{
Console.WriteLine(ct.Message); //打印异常信息
}
//finally 块可用于发布资源(如文件流、数据库连接和图形句柄)而无需等待运行时中的垃圾回收器来完成对象。
finally
{
Console.WriteLine("最终执行,一般用于回收或释放资源!");
}
Console.ReadLine();
}
编译器生成的异常
当基本操作失败时,.NET 运行时会自动引发一些异常。 这些异常及其错误条件在下表中列出。
例外 |
描述 |
ArithmeticException |
算术运算期间出现的异常的基类,例如 DivideByZeroException 和 OverflowException。 |
ArrayTypeMismatchException |
由于元素的实际类型与数组的实际类型不兼容而导致数组无法存储给定元素时引发。 |
DivideByZeroException |
尝试将整数值除以零时引发。 |
IndexOutOfRangeException |
索引小于零或超出数组边界时,尝试对数组编制索引时引发。 |
InvalidCastException |
从基类型显式转换为接口或派生类型在运行时失败时引发。 |
NullReferenceException |
尝试引用值为 null 的对象时引发。 |
OutOfMemoryException |
尝试使用新运算符分配内存失败时引发。 此异常表示可用于公共语言运行时的内存已用尽。 |
OverflowException |
checked 上下文中的算术运算溢出时引发。 |
StackOverflowException |
执行堆栈由于有过多挂起的方法调用而用尽时引发;通常表示非常深的递归或无限递归。 |
TypeInitializationException文章来源:https://www.toymoban.com/news/detail-516234.html |
静态构造函数引发异常并且没有兼容的 catch 子句来捕获异常时引发。文章来源地址https://www.toymoban.com/news/detail-516234.html |
到了这里,关于C#异常和异常处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!