652
社区成员
🌷大家好,我是writer桑,前面一章已经学习了 C# 中面向对象编程的知识点,那本章就开始学习 C# 程序中的异常处理操作。为了更好的处理在编程过程中遇到的异常问题,笔者建议大家多实践,不断从实践中总结经验。
异常指的是程序运行过程中发生的特殊响应,通常是由外部问题(如硬件、输入错误)所导致的。 在 C# 等面向对象的编程语言中异常也属于对象。 C# 语言的异常处理功能处理在程序运行期间发生的任何意外或异常情况。异常处理提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw。
示例如下:
public class ExceptionTest // 异常测试
{
static double SafeDivision(double x, double y)
{
if (y == 0)
throw new DivideByZeroException();
return x / y;
}
public static void Main()
{
//用于测试的输入。更改值以查看
//异常处理行为
double a = 98, b = 0;
double result;
try
{
result = SafeDivision(a, b);
Console.WriteLine("{0} 除以 {1} = {2}", a, b, result);
}
catch (DivideByZeroException)
{
Console.WriteLine("尝试除以0错误。");
}
}
}
try、catch、finally 和 throw 关键字的简述:
在 C# 中,程序运行时的错误通过一种称为"异常"的机制在程序中传播。异常从错误的代码引发,由能够更正错误的代码捕作。C# 提供了内置的 try-catch、try-finally 和 try-catch-finally 的异常处理语句,可以使用这些语句来完成对异常发生的响应。 未能捕获的异常由系统提供的通用异常处理程序处理,该处理程序会显示一个对话框和错误信息。
示例如下:
// try-catch 语句示例
public class TrycatchTest
{
static void ProcessString(string s)
{
if (s == null)
{
throw new ArgumentNullException(paramName: nameof(s), message: "Parameter can't be null");
}
}
public static void Main()
{
try
{
string s = null;
ProcessString(s);
}
// 最具体的异常:
catch (ArgumentNullException e)
{
Console.WriteLine("{0} First exception caught.", e);
}
// 至少明确的异常:
catch (Exception e)
{
Console.WriteLine("{0} Second exception caught.", e);
}
}
}
/*
输出:
System.ArgumentNullException: Parameter can't be null (Parameter 's')
*/
// try-finally 语句的示例
public class TryfinallyTest
{
public static void Main()
{
int i = 123;
string s = "Some string";
object obj = s;
try
{
// 无效的转换; Obj包含字符串,而不是数字类型。
i = (int)obj;
// 不会运行下面的语句。
Console.WriteLine("WriteLine at the end of the try block.");
}
finally
{
Console.WriteLine("\nExecution of the finally block after an unhandled\n" +
"error depends on how the exception unwind operation is triggered.");
Console.WriteLine("i = {0}", i);
}
}
// 输出:
// Unhandled exception.System.InvalidCastException:
// Unable to cast object of type 'System.String' to type 'System.Int32'.
// Execution of the finally block after an unhandled
// error depends on how the exception unwind operation is triggered.
// i = 123
}
// try-catch-finally 语句的示例:
public class TrycatchfinallyTest
{
void ReadFile(int index)
{
// 要运行此代码,请替换本地机器上的有效路径
string path = @"c:\users\public\test.txt";
System.IO.StreamReader file = new System.IO.StreamReader(path);
char[] buffer = new char[10];
try
{
file.ReadBlock(buffer, index, buffer.Length);
}
catch (System.IO.IOException e)
{
Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message);
}
finally
{
if (file != null)
{
file.Close();
}
}
}
}
一些补充的内容:
注意在 try 块内初始化的变量,只能在 try 这个代码块内使用。否则在未对变量初始化之前,引用变量会出现异常。例如在下面的代码示例中,变量 n 在 try 块内部初始化,尝试在 WriteLine(n) 语句的 try 块外部使用此变量将生成编译器错误。
示例如下:
using System;
public class Program
{
static void Main()
{
int n;
try
{
// 不要在这里初始化这个变量。
n = 123;
}
catch
{
}
// Error: Use of unassigned local variable 'n'.
Console.WriteLine(n);
}
}
如果使用 catch 块时想对异常进一步筛选时,可以在 catch 子句的基础上使用 when 关键字加一个布尔表达式来声明。 如果异常筛选器返回 false ,则继续搜索处理程序。
示例如下:
// 表示匹配变量 e 的 ParamName 属性等于字符串 ...
catch (ArgumentException e) when (e.ParamName == "…")
{
// recover from exception
}
除了 C# 内置的异常之外,也可以自定义异常,然后用 throw 关键字抛出。用户自定义的异常类派生自 ApplicationException 或 Exception 类。
示例如下:
using System;
class TestProgram
{
static void Main(string[] args)
{
Program temp = new Program();
try
{
temp.showTemp();
}
catch (DivideByZeroException e)
{
Console.WriteLine("DivideByZeroException: {0}", e.Message);
}
Console.ReadKey();
}
}
public class DivideByZeroException : ApplicationException
{
public DivideByZeroException(string? message) : base(message)
{
}
}
public class Program
{
int number = 0;
public void showTemp()
{
if (number == 0)
{
throw (new DivideByZeroException("Zero Program found"));
}
else
{
Console.WriteLine("Program: {0}", number);
}
}
}
当有以下情况时,开发者应引发异常:
引发异常时应避免的做法:
当基础操作失败时,.NET 运行时会自动引发一些异常。下表展示这些异常及其错误条件:
异常错误条件ArithmeticException算术运算期间出现的异常的基类,例如 DivideByZeroException(除零异常)和OverflowException(溢出异常)。ArrayTypeMismatchException由于元素的实际类型与数组的实际类型不兼容而导致数组无法存储给定元素时引发。DivideByZeroException尝试将整数值除以零时引发。IndexOutOfRangeException索引小于零或超出数组边界时,尝试对数组编制索引时引发。InvalidCastException从基类型显式转换为接口或派生类型在运行时失败时引发。NullReferenceException尝试引用值为 null 的对象时引发。OutOfMemoryException尝试使用新运算符分配内存失败时引发。 此异常表示可用于公共语言运行时的内存已用尽。OverflowExceptionchecked 上下文中的算术运算溢出时引发。StackOverflowException执行堆栈由于有过多挂起的方法调用而用尽时引发;通常表示非常深的递归或无限递归。TypeInitializationException静态构造函数引发异常并且没有兼容的 catch 子句来捕获异常时引发。
🌺 以上就是 C# 异常处理操作的介绍啦,希望能够对大家有所帮助。望大家多多支持,你们的支持就是笔者创作最大的动力!
文章来源: https://blog.csdn.net/weixin_61361738/article/details/129210302
版权声明: 本文为博主原创文章,遵循CC 4.0 BY-SA 知识共享协议,转载请附上原文出处链接和本声明。