C#中try...catch的使用与常见面试题分享
作者:wolfy 时间:2022-10-22 16:30:35
前言
C#中Try-Catch语句大家都很熟悉了,但是细究起来,还是有很多东西可讲的。最近在翻看之前总结的常见面试题中,发现关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下。
try..catch语法
try-catch语句由一个try块后跟一个或多个catch子句构成,这些子句制定不同的异常处理程序。
引发异常时,公共语言运行时(CLR)会查找处理此异常的catch语句。如果当前执行的方法不包含这样的catch块,则CLR会查看调用当前方法的方法,然后会遍历叠用堆栈。如果找不到catch块,则CLR会向用户显示一天有关未处理的异常的消息并停止执行程序。
try块包含可能导致异常的保护代码。该块一直执行到引发异常或成功完成为止。
class Program
{
static void Main(string[] args)
{
object o = null;
try
{
//强制转换 null 对象的尝试引发 NullReferenceException 异常
int i = (int)o;
}
catch (NullReferenceException ex)
//1.虽然可以使用不带参数的 catch 子句捕捉任何类型的异常,但不推荐这种用法。 通常,您应该只捕捉那些您知道如何从中恢复的异常。 因此,应该总是指定一个从 System.Exception 派生的对象参数。
//2.在同一个 try-catch 语句中可以使用一个以上的特定 catch 子句。 这种情况下 catch 子句的顺序很重要,因为会按顺序检查 catch 子句。 将先捕获特定程度较高的异常,而不是特定程度较小的异常。 如果对 catch 块进行排序以使永远不能达到后面的块,编译器将产生错误。
//3. int i = (int)o; 很有可能引发NullReferenceException异常,所以将此catch放在前面
//4.如果将catch (Exception ex)放在第一个,将不会达到后面的块,编译器将产生错误。
{
Console.WriteLine(ex.Message);
}
catch (DivideByZeroException div)
{
Console.WriteLine(div.Message);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.Read();
}
try-catch的基本语法如上面所述,try-catch的执行顺序是:try块中的代码执行出现异常将执行catch块中的代码,如果try块中的执行没有错误,将try块中的代码执行完,不会执行catch块中的语句。
try-catch-finally:不管是否有异常,finally块中的代码都会执行,finally块常用于资源的释放等。
try-catch的笔试题
第一种:值类型的
static int GetResult()
{
int a = 1;
int b = 2;
int n = 1;
try
{
int k = a / b;
return n;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
finally//不管有没有发生异常 finally都会执行
{
n++;
}
}
可能你已经知道结果了:1,为什么呢?咱们可以看看反编译的代码,你就会清楚为什么了。
第二种:引用类型的
static Person GetResult()
{
int a = 1;
int b = 2;
Person p = new Person();
p.Age = 1;
try
{
int k = a / b;
return p;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
finally//不管有没有发生异常 finally都会执行
{
p.Age++;
}
}
那么返回的这个person的age是多少呢?先看反编译的结果:
结果为:2
总结
这个题考察还是try-catch-finally的执行顺序,以及引用类型和值类型,这里总结这个,只是换个角度重新学习一下。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
IP查询系统的异步回调案例
swing分割窗口控件JSplitPane使用方法详解
Android自带emoji表情的使用方法详解
![](https://img.aspxhome.com/file/2023/7/94967_0s.png)
java如何从不规则的字符串中截取出日期
![](https://img.aspxhome.com/file/2023/7/85547_0s.png)
关于Android中drawable必知的一些规则
c#获取相同概率随机数的算法代码
SpringBoot使用注解进行分页的实现示例
![](https://img.aspxhome.com/file/2023/3/75473_0s.jpg)
SpringBoot实现监控Actuator,关闭redis监测
![](https://img.aspxhome.com/file/2023/6/130006_0s.jpg)
Android Jni的简单使用详解
![](https://img.aspxhome.com/file/2023/7/137917_0s.gif)
浅析Java多线程同步synchronized
C#文件下载实例代码(适用于各个浏览器)
C#任务并行Parellel.For和Parallel.ForEach
![](https://img.aspxhome.com/file/2023/5/85685_0s.png)
Android 连接Wifi和创建Wifi热点的实例
C#中Thread(线程)和Task(任务)实例详解
![](https://img.aspxhome.com/file/2023/4/104314_0s.png)
JavaWeb项目Servlet无法访问问题解决
C# 使用 Castle 实现 AOP及如何用 Autofac 集成 Castle
Android带进度条的文件上传示例(使用AsyncTask异步任务)
![](https://img.aspxhome.com/file/2023/4/72624_0s.png)
谈谈Android的三种网络通信方式
![](https://img.aspxhome.com/file/2023/5/99805_0s.png)
Android中ListView如何分页加载数据
![](https://img.aspxhome.com/file/2023/5/137355_0s.jpg)
Android性能优化全局异常处理详情
![](https://img.aspxhome.com/file/2023/1/139631_0s.png)