最近在系统学习c#的知识点,有一些知识点比较散且使用频率不高,现在此记录,便于复习。
关于c#的异常处理
一句话概括,异常是程序执行期间出现的问题,异常处理的目的是为了维护程序的健壮性和稳定性。举个栗子,比如说除以0,用户输入的数据与预设数据类型不符,数组越界,栈溢出等等。c#给我们提供了一些易于使用的解决方法。主要由四个关键词组成(当然还有其他) : try,catch,throw,finally
- try:用于存放可能会出现问题的语句,后面可以跟多个catch
- catch:用于捕捉异常,通常跟在try后面
- throw:用于抛出异常,是的,你没看错,比如说为了限制输入范围,限制输入的数字为1~10之间,主要用于自定义的限制
- finally:不管是否有异常,里面的代码块必定执行,通常跟try一起。
在菜鸟教程中,有一个易于理解的伪代码
点击查看代码
try
{
// 引起异常的语句
}
catch( ExceptionName e1 )
{
// 错误处理代码
}
catch( ExceptionName e2 )
{
// 错误处理代码
}
catch( ExceptionName eN )
{
// 错误处理代码
}
finally
{
// 要执行的语句
}
c#中的异常类
C# 异常是使用类来表示的。C# 中的异常类主要是直接或间接地派生于 System.Exception 类。
System.ApplicationException 和 System.SystemException 类是派生于 System.Exception 类的异常类。
System.ApplicationException 类支持由应用程序生成的异常。所以程序员定义的异常都应派生自该类。
System.SystemException 类是所有预定义的系统异常的基类。
下表列出了一些派生自 System.SystemException 类的预定义的异常类:
异常类 | 描述 |
---|---|
System.IO.IOException | 处理 I/O 错误。 |
System.IndexOutOfRangeException | 处理当方法指向超出范围的数组索引时生成的错误。 |
System.ArrayTypeMismatchException | 处理当数组类型不匹配时生成的错误。 |
System.NullReferenceException | 处理当依从一个空对象时生成的错误。 |
System.DivideByZeroException | 处理当除以零时生成的错误。 |
System.InvalidCastException | 处理在类型转换期间生成的错误。 |
System.OutOfMemoryException | 处理空闲内存不足生成的错误。 |
System.StackOverflowException | 处理栈溢出生成的错误。 |
通过代码来学习简单的异常处理
第一个是关于除以0的例子
点击查看代码
using System;
namespace ErrorHandlingApplication
{
class DivNumbers
{
int result;
DivNumbers()
{
result = 0;
}
public void division(int num1, int num2)
{
//用于防止可能出现异常的代码块
try
{
result = num1 / num2;
}
//用于捕捉异常,有多种写法
//1. catch (系统自带异常 e)比如下面的DivideByZeroException
//2. catch (Exception e) 常规所有异常
//3. catch 可以省略括号,等同于第二种写法,但是有时候要用的参数,根据情况使用
//4. catch (程序员自定义异常 e) <-需要注意的是,e只是一个参数名,不必过于纠结->
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();
}
}
}
第二个例子,程序员自定义异常类型
点击查看代码
using System;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
int age;
try
{
age = int.Parse(Console.ReadLine());
if (age < 18 || age > 45)
{
throw new AgeException("年龄必须在18到45岁之间!");
}
else
{
Console.WriteLine(age);
}
}
catch (AgeException e)
{
Console.WriteLine(e);
}
catch (Exception e)
{
Console.WriteLine(e);
Console.WriteLine();
Console.WriteLine("输入数据错误");
}
finally
{
Console.WriteLine();
Console.WriteLine("HELLO");
}
}
}
}
public class AgeException: ApplicationException
{
public AgeException(string message) : base(message)
{
}
}
关于catch的小知识点
不管是程序员自定义的异常类型,还是系统自带的异常类型,都继承于 System.Execption 类。catch的规则是执行完第一个符合异常的 catch 后面就不会再执行了,所以说越具体的要放在越前面。
学习参考
菜鸟教程 - https://www.runoob.com/csharp/csharp-exception-handling.html
微软官方doc - https://docs.microsoft.com/zh-cn/dotnet/csharp/fundamentals/exceptions/
《visual c#从入门到精通》- 第六章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律