【C#学习】异常处理

官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/exceptions/

C# 异常处理和C++很像,也是 try, catch , final。C# 语言的异常处理功能有助于处理在程序运行期间发生的任何意外或异常情况。 异常处理功能使用 try、catch 和 finally 关键字来尝试执行可能失败的操作、在你确定合理的情况下处理故障,以及在事后清除资源。 公共语言运行时 (CLR)、.NET Framework/任何第三方库或应用程序代码都可以生成异常。 异常是使用 throw 关键字创建而成。C# 中的异常是最终全都派生自 System.Exception 的类型。

异常具有以下属性: 

  1. 异常是最终全都派生自 System.Exception 的类型。
  2. 在可能抛出异常的语句周围使用 try 代码块。
  3. 在 try 代码块中出现异常后,控制流会跳转到调用堆栈中任意位置上的首个相关异常处理程序。 在 C# 中,catch 关键字用于定义异常处理程序。
  4. 如果给定的异常没有对应的异常处理程序,那么程序会停止执行,并显示错误消息。
  5. 除非可以处理异常并让应用程序一直处于已知状态,否则不捕获异常。 如果捕获 System.Exception,使用 catch 代码块末尾的 throw 关键字重新抛出异常。
  6. 如果 catch 代码块定义异常变量,可以用它来详细了解所发生的异常类型。
  7. 使用 throw 关键字,程序可以显式生成异常。
  8. 异常对象包含错误详细信息,如调用堆栈的状态和错误的文本说明。
  9. 即使有异常抛出,finally 代码块中的代码仍会执行。 使用 finally 代码块可释放资源。例如,关闭在 try 代码块中打开的任何流或文件。

使用异常

异常可由 .NET Framework 公共语言运行时 (CLR) 或由程序中的代码引发。 finally 块无论是否抛出异常都会被执行,且在try和catch之后执行,即便try和catch中可能会return, continue, break, goto等等,finally块都是永远被执行

  1. catch 关键字后指定的异常对象是catch块的局部变量,在该catch块以外无效。如果catch块中不会用到异常对象,则括号里可以只写异常对象的类型,不必写异常对象的名称;如果只写了catch关键字,没有写括号和异常对象,那么是默认的捕获类型Exception。且这种catch块必须在常规catch块的最后,且只能有一个。
  2. finally 块必须在try 和 catch块的后面。且 finally 块中不允许 return。如果在finally 块中用了break, continue, 和 goto 语句,则目的地也必须还在此finally 块中。总结来说,finally 块中的跳转语句不能跳出代码段之外。
  3. try 和 catch块的跳转(return, continue, break, goto)没有限制。
  4. 在try和catch块中都可以 throw 抛出异常。

异常处理有三种形式的写法,必须至少有一个catch或者finally块,一个不具有 catch 或 finally 块的 try 块会导致编译器错误。:

try-catch 语句

try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    // Code to handle the exception goes here.
    // Only catch exceptions that you know how to handle.
    // Never catch base class System.Exception without
    // rethrowing it at the end of the catch block.
}

try-finally 语句

try
{
    // Code to try goes here.
}
finally
{
    // Code to execute after the try block goes here.
}

try-catch-finally 语句

try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    // Code to handle the exception goes here.
}
finally
{
    // Code to execute after the try (and possibly catch) blocks 
    // goes here.
}

一般来说,不会在 try 里面直接写 throw XXX, 而是由try所调用的函数抛出异常,然后catch处理。CLR 会展开堆栈,同时针对特定异常类型查找包含 catch 代码块的方法,并执行找到的首个此类 catch 代码块。 如果在调用堆栈中找不到相应的 catch 代码块,将会终止进程并向用户显示消息。如果引发异常的语句不在 try 块内或者包含该语句的 try 块没有匹配的 catch 块,则运行时将检查调用方法中是否有 try 语句和 catch 块。 运行时将继续调用堆栈,搜索兼容的 catch 块。 在找到并执行 catch 块之后,控制权将传递给 catch 块之后的下一个语句。

一个 try 语句可包含多个 catch 块。 将执行第一个
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值