异常是在执行程序期间出现的问题. AC#exception是对程序运行时出现的异常情况的响应,例如尝试除以零.
例外提供了一种从一个部分转移控制的方法程序到另一个. C#异常处理基于四个关键字:尝试,捕获,最后,抛出.
尝试 : try块标识激活了特定异常的代码块.接下来是一个或多个捕获块.
catch : 程序在您要处理问题的程序中的位置捕获异常处理程序的异常. catch关键字表示捕获异常.
最后 : finally块用于执行给定的一组语句,无论是抛出还是不抛出异常.例如,如果您打开文件,则必须关闭它是否引发异常.
throw : 当问题出现时,程序会抛出异常.这是使用throw关键字完成的.
语法
假设某个块引发异常,方法使用try和catch关键字的组合捕获异常. try/catch块放在可能生成异常的代码周围. try/catch块中的代码称为受保护代码,使用try/catch的语法类似于以下 :
try { // statements causing exception} catch( ExceptionName e1 ) { // error handling code} catch( ExceptionName e2 ) { // error handling code} catch( ExceptionName eN ) { // error handling code} finally { // statements to be executed}
如果try块在不同情况下引发多个异常,你可以列出多个catch语句来捕获不同类型的异常.
异常类在C#
C#异常由类表示. C#中的异常类主要直接或间接地从 System.Exception 类派生.从System.Exception类派生的一些异常类是 System.ApplicationException 和 System.SystemException 类.
System.ApplicationException 类支持应用程序生成的异常.因此,程序员定义的异常应该来自这个类.
System.SystemException 类是所有预定义系统异常的基类.
下表提供了一些从Sytem.SystemException类派生的预定义异常类 :
Sr.No. | Exception Class&说明 |
---|---|
1 | System.IO.IOException 处理I/O错误. |
2 | System.IndexOutOfRangeException 处理生成的错误当一个方法引用超出范围的数组索引时. |
3 | System.ArrayTypeMismatchException 处理当类型与数组类型不匹配时生成的错误. |
4 | System.NullReferenceException 处理引用空对象时产生的错误. |
5 | System.DivideByZeroException 处理由将红利除以零. |
6 | System.InvalidCastException Han在类型转换期间生成的dles错误. |
7 | System.OutOfMemoryException 处理因可用内存不足而产生的错误. |
8 | System.StackOverflowException 处理堆栈溢出产生的错误. |
处理异常
C#以try和catch块的形式提供了异常处理的结构化解决方案.使用这些块,核心程序语句与错误处理语句分开.
这些错误处理块是使用 try , catch ,最后关键字.以下是在零除条件发生时抛出异常的示例;
using System;namespace ErrorHandlingApplication { class DivNumbers { int result; DivNumbers() { result = 0; } public void division(int num1, int num2) { try { result = num1 / num2; } catch (DivideByZeroException e) { Console.WriteLine("Exception caught: {0}", e); } finally { Console.WriteLine("Result: {0}", result); } } static void Main(string[] args) { DivNumbers d = new DivNumbers(); d.division(25, 0); Console.ReadKey(); } }}
编译并执行上述代码时,会产生以下结果 :
Exception caught: System.DivideByZeroException: Attempted to divide by zero. at ...Result: 0
创建用户定义的例外
你也可以定义自己的例外.用户定义的异常类派生自 Exception 类.以下示例演示了此 :
using System;namespace UserDefinedException { class TestTemperature { static void Main(string[] args) { Temperature temp = new Temperature(); try { temp.showTemp(); } catch(TempIsZeroException e) { Console.WriteLine("TempIsZeroException: {0}", e.Message); } Console.ReadKey(); } }}public class TempIsZeroException: Exception { public TempIsZeroException(string message): base(message) { }}public class Temperature { int temperature = 0; public void showTemp() { if(temperature == 0) { throw (new TempIsZeroException("Zero Temperature found")); } else { Console.WriteLine("Temperature: {0}", temperature); } }}
编译并执行上述代码时,会产生以下结果 :
TempIsZeroException: Zero Temperature found
投掷对象
如果对象是直接或间接派生自 System.Exception 类,则可以抛出该对象.您可以在catch块中使用throw语句将当前对象抛出为 :
Catch(Exception e) { ... Throw e}