轻松学习C#的异常处理
作者:lijiao 发布时间:2022-09-14 22:10:20
异常是程序运行中发生的错误,异常处理是程序设计的一部分。错误的出现并不总是编写应用程序者的原因,有时候应用程序会因为终端用户的操作发生错误。无论如何,在编写程序前,都应该预测应用程序和代码中出现的错误。一般良好的编程规范也会避免一些不必要的程序错误的出现。
在项目的开发过程中,并不是所有的代码执行都和想象那样理想,总是避免不了异常的发生。这就需要编程语言的去处理这些异常,C#语言中有三种异常处理语句:
try...catch;//处理异常
try...finally;//清楚异常
try...catch...finally;//处理所有异常
一、用try...catch语句捕获异常
在try语句中包含容易产生异常的代码,接着捕获异常,catch段里的代码会注意进行适当的处理,
格式为:
try
{
}
catch(异常类 异常对象实例)
{
}
例一:用上述的语句捕获访问整型数组nums时产生索引越界异常,并提示给用户:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Text
{
class Program
{
static void Main(string[] args)
{
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
try//捕获异常
{
for (int i = 0; i <= nums.Length; i++)//遍历数组所有元素
{
Console.Write(nums[i] + " ");
}
}
catch (Exception a)//访问异常对象
{
Console.Write(a.Message);//输出异常错误
}
Console.WriteLine();
Console.ReadLine();
}
}
}
输出的结果为:
由于数据元素的索引是从0开始的,for语句遍历数组元素时,用了“小于或等于”,正好多遍历一次,所以出现索引越界。
二、清除与处理所有异常
如果用户对产生的错误不进行处理,而清除产生的错误分配的资源,那么可以使用try...finally语句来完成,这里的finally块用于清除try块中分配的任何资源以及运行任何即使在发生异常时也必须执行的带代码。格式为:
try
{
}
catch(异常类 异常对象实例)
{
}
finally
{
}
这个组合是处理所有异常最好的,它合并前面两种错误处理技术,即捕获错误,清除并继续执行应用程序。
例二:用240去除这个数组中的各元素,由于数组中的元素值有0,所以会产生处数据为0的错误。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Text
{
class Program
{
static void Main(string[] args)
{
int[] nums = { 4,8,12,0,10 };
try//捕获异常
{
for (int i = 0; i < nums.Length; i++)
{
int valude = 0;
valude = 240 / nums[i];
Console.WriteLine("240/{0}={1}", nums[i], valude);
}
}
catch (Exception a)//访问异常对象
{
Console.WriteLine(a.Message);//输出异常错误
}
finally
{
Console.WriteLine("有没有异常我都会运行");
}
Console.WriteLine();
Console.ReadLine();
}
}
}
输出的结果为:
三、引发异常
在编写程序时,有时可能要引发异常,以便捕获异常。引发异常是通过throw语句和一个适当的异常类来实现的。其格式为:
throw new 异常类(异常描述);
异常类可以是C#语言类库中提供的异常类,也可以是自定义异常类。异常描述为可选择项,用来描述产生异常错误,可产生异常时捕获到以便快速找到产生错误的代码。
例三:将字符串转换为整数的异常
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Text
{
class Program
{
static void Main(string[] args)
{
string str = "string";
try
{
int returnInt;
returnInt = Program.ConvertStringToInt(str);//调用转换
Console.Write(returnInt);
}
catch (FormatException a)
{
Console.WriteLine(a.Message);
}
Console.ReadLine();
}
private static int ConvertStringToInt(string str)//定义转换函数
{
int intNum = 0;
try
{
intNum = Convert.ToInt32(str);
return intNum;
}
catch
{
throw new FormatException("转换错误");//引发异常
}
}
}
}
输出的结果为:
四、自定义异常类
C#语言虽然预定义了许多异常类,但是,在有些场合,创建自己的异常类可能会方便。自定义异常类是通过继承System.Exception类来创建自己的异常类。其步骤是:
(1)声明一个异常,格式如下:class 异常类名:Exception{ }
(2)引发自己的异常,格式如下: throw(ExceptionName);
例四:定义一个异常类MyException,然后引发这个异常类。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Text
{
class MyException : SystemException { }//声明异常
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("引发异常前我是被执行的");//引发异常前的提示
throw new MyException();
Console.WriteLine("因为已经引发异常,所以我不能被执行");
}
catch (MyException)
{
Console.WriteLine("引发异常");
}
Console.ReadLine();
}
}
}
输出的结果为:
猜你喜欢
- HttpClient模拟浏览器登录后发起请求浏览器实现这个效果需要如下几个步骤: 1请求一个需要登录的页
- properties配置文件如下:human.name=Mr.Yuhuman.age=21human.gender=male如何把prope
- 在使用Java web开发的后端工程师们大多会使用Maven作为项目构建以及编译的工具,微服务和大中台当道的今天,更加关注maven的细节是
- 前言最近有一项需求,要定时判断任务执行条件是否满足并触发 Spark 任务,平时编写 Spark 任务时都是封装为一个 Jar 包,然后采用
- 本文使用的Unicode+DLL+Debug的方式,因为不想最后生成的exe文件太大。环境搭建步骤如下:1、下载wxWidgets包:登录w
- 前面,学了物体的移动功能,现在来学一下C#实现鼠标控制摄像机(视角)移动。代码如下:C#脚本(在Unity 5.5.1 下能运行):usin
- 概述 这是一个自定义色盘,根据点,直线和圆的几何学加上hsv颜色模型完成技术点几何:圆的标准方程式:(x-a)²
- 1.char数组(字符数组)->字符串可以通过:使用String.copyValueOf(charArray)函数实现。举例:char
- 本文为大家分享了一个简单的android左滑删除控件,供大家参考,具体内容如下import android.animation.ValueA
- 有时候有一些DOS命令需要我们在执行程序的时候调用,这需要使用C#提供的相关接口。代码如下,很简单,相信大家都能看懂,我就不赘述了。usin
- 本文实例讲述了JavaWeb 网上书店 注册和登陆功能。分享给大家供大家参考,具体如下:工具:Eclipse + Navicat源码地址:h
- 1 前言有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http、https、ftp、socks代理。比如在IE浏览器设置代理。
- 这是一个介绍基本异常处理的小例子,包括抛出,捕获,断言,日志。Java异常处理通过5个关键字try、catch、throw、throws、f
- 情景描述将一个时间转换为对应的unix时间戳,字符集使用UTF-8编码,数据通讯统一采用 HTTP 协议通讯,使用POST 方法请求并传递参
- 我们在使用SpringBoot进行测试的时候一般是需要加两个注解:@SpringBootTest目的是加载ApplicationContex
- 要求:1.配置文件的namespace名称空间指定为接口的全类名2.配置文件中的id唯一标识与接口中的方法对应(返回值类型对应,方法名对应,
- XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(St
- Accessors翻译是存取器。通过该注解可以控制getter和setter方法的形式。 @Accessors(fluent = true)
- 今天看到EOE问答里面有这“[Android 界面]NotificationManager 如何使用Bitmap做图标”这样一个问题,在论坛
- 本项目主要实现对汽车维修厂的信息化管理功能,主要包含三个角色:管理员,维修师傅,客户。实现的主要功能包含用户管理、配置管理、汽车管理、故障管