做静态网站工资多少,网站建设好弄不好弄,google建站推广,腾讯快速建站平台在 C# 中#xff0c;程序中的运行时错误通过使用一种称为“异常”的机制在程序中传播。 异常由遇到错误的代码引发#xff0c;由能够更正错误的代码捕捉。 异常可由 .NET 运行时或由程序中的代码引发。 一旦引发了一个异常#xff0c;此异常会在调用堆栈中传播#xff0c;直…在 C# 中程序中的运行时错误通过使用一种称为“异常”的机制在程序中传播。 异常由遇到错误的代码引发由能够更正错误的代码捕捉。 异常可由 .NET 运行时或由程序中的代码引发。 一旦引发了一个异常此异常会在调用堆栈中传播直到找到针对它的 catch 语句。 未捕获的异常由系统提供的通用异常处理程序处理该处理程序会显示一个对话框。
异常由从 Exception 派生的类表示。 此类标识异常的类型并包含详细描述异常的属性。 引发异常涉及创建异常派生类的实例配置异常的属性可选然后使用 throw 关键字引发该对象。 例如
class CustomException : Exception
{public CustomException(string message){}
}
private static void TestThrow()
{throw new CustomException(Custom exception in TestThrow());
}
引发异常后运行时将检查当前语句以确定它是否在 try 块内。 如果在则将检查与 try 块关联的所有 catch 块以确定它们是否可以捕获该异常。 Catch 块通常会指定异常类型如果该 catch 块的类型与异常或异常的基类的类型相同则该 catch 块可处理该方法。 例如
try
{TestThrow();
}
catch (CustomException ex)
{System.Console.WriteLine(ex.ToString());
}
如果引发异常的语句不在 try 块内或者包含该语句的 try 块没有匹配的 catch 块则运行时将检查调用方法中是否有 try 语句和 catch 块。 运行时将继续调用堆栈搜索兼容的 catch 块。 在找到并执行 catch 块之后控制权将传递给 catch 块之后的下一个语句。
一个 try 语句可包含多个 catch 块。 将执行第一个能够处理该异常的 catch 语句将忽略任何后续的 catch 语句即使它们是兼容的也是如此。 按从最具有针对性(或派生程度最高)到最不具有针对性的顺序对 catch 块排列。 例如
using System;
using System.IO;namespace Exceptions
{public class CatchOrder{public static void Main(){try{using (var sw new StreamWriter(./test.txt)){sw.WriteLine(Hello);}}// Put the more specific exceptions first.catch (DirectoryNotFoundException ex){Console.WriteLine(ex);}catch (FileNotFoundException ex){Console.WriteLine(ex);}// Put the least specific exception last.catch (IOException ex){Console.WriteLine(ex);}Console.WriteLine(Done);}}
}
执行 catch 块之前运行时会检查 finally 块。 Finally 块使程序员可以清除中止的 try 块可能遗留下的任何模糊状态或者释放任何外部资源(例如图形句柄、数据库连接或文件流)而无需等待垃圾回收器在运行时完成这些对象。 例如
static void TestFinally()
{FileStream? file null;//Change the path to something that works on your machine.FileInfo fileInfo new System.IO.FileInfo(./file.txt);try{file fileInfo.OpenWrite();file.WriteByte(0xF);}finally{// Closing the file allows you to reopen it immediately - otherwise IOException is thrown.file?.Close();}try{file fileInfo.OpenWrite();Console.WriteLine(OpenWrite() succeeded);}catch (IOException){Console.WriteLine(OpenWrite() failed);}
}
如果 WriteByte() 引发了异常并且未调用 file.Close()则第二个 try 块中尝试重新打开文件的代码将会失败并且文件将保持锁定状态。 由于即使引发异常也会执行 finally 块前一示例中的 finally 块可使文件正确关闭从而有助于避免错误。
如果引发异常之后没有在调用堆栈上找到兼容的 catch 块则会出现以下三种情况之一
如果异常存在于终结器内将中止终结器并调用基类终结器(如果有)如果调用堆栈包含静态构造函数或静态字段初始值设定项将引发 TypeInitializationException同时将原始异常分配给新异常的 InnerException 属性如果到达线程的开头则终止线程