首页 > 学院 > 开发设计 > 正文

[c#基础]关于try...catch最常见的笔试题

2019-11-17 03:21:25
字体:
来源:转载
供稿:网友

[c#基础]关于try...catch最常见的笔试题

引言

在翻看之前总结的常见面试题中,关于try...catch异常处理的还是蛮多了,今天看到这个面试题,也就重新学习一下。

try..catch语法

try-catch语句由一个try块后跟一个或多个catch子句构成,这些子句制定不同的异常处理程序。

引发异常时,公共语言运行时(CLR)会查找处理此异常的catch语句。如果当前执行的方法不包含这样的catch块,则CLR会查看调用当前方法的方法,然后会遍历叠用堆栈。如果找不到catch块,则CLR会向用户显示一天有关未处理的异常的消息并停止执行程序。

try块包含可能导致异常的保护代码。该块一直执行到引发异常或成功完成为止。

 1     class PRogram 2     { 3         static void Main(string[] args) 4         { 5             object o = null; 6             try 7             { 8                 //强制转换 null 对象的尝试引发 NullReferenceException 异常 9                 int i = (int)o;10             }11 12             catch (NullReferenceException ex)13             //1.虽然可以使用不带参数的 catch 子句捕捉任何类型的异常,但不推荐这种用法。 通常,您应该只捕捉那些您知道如何从中恢复的异常。 因此,应该总是指定一个从 System.Exception 派生的对象参数。14             //2.在同一个 try-catch 语句中可以使用一个以上的特定 catch 子句。 这种情况下 catch 子句的顺序很重要,因为会按顺序检查 catch 子句。 将先捕获特定程度较高的异常,而不是特定程度较小的异常。 如果对 catch 块进行排序以使永远不能达到后面的块,编译器将产生错误。15             //3. int i = (int)o; 很有可能引发NullReferenceException异常,所以将此catch放在前面16             //4.如果将catch (Exception ex)放在第一个,将不会达到后面的块,编译器将产生错误。17             {18                 Console.WriteLine(ex.Message);19             }20             catch (DivideByZeroException div)21             {22                 Console.WriteLine(div.Message);23             }24             catch (Exception ex)25             {26                 Console.WriteLine(ex.Message);27             }28             Console.Read();29         }

try-catch的基本语法如上面所述,try-catch的执行顺序是:try块中的代码执行出现异常将执行catch块中的代码,如果try块中的执行没有错误,将try块中的代码执行完,不会执行catch块中的语句。

try-catch-finally:不管是否有异常,finally块中的代码都会执行,finally块常用于资源的释放等。

try-catch的笔试题

第一种:值类型的

 1         static int GetResult() 2         { 3             int a = 1; 4             int b = 2; 5             int n = 1; 6             try 7             { 8                 int k = a / b; 9                 return n;10             }11             catch (Exception ex)12             {13 14                 Console.WriteLine(ex.Message);15                 throw;16             }17             finally//不管有没有发生异常 finally都会执行18             {19                 n++;20             }21         }

可能你已经知道结果了:1,为什么呢?咱们可以看看反编译的代码,你就会清楚为什么了。

第二种:引用类型的

 1 static Person GetResult() 2         { 3             int a = 1; 4             int b = 2; 5             Person p = new Person(); 6             p.Age = 1; 7             try 8             { 9                 int k = a / b;10                 return p;11             }12             catch (Exception ex)13             {14 15                 Console.WriteLine(ex.Message);16                 throw;17             }18             finally//不管有没有发生异常 finally都会执行19             {20                 p.Age++;21             }22         }

那么返回的这个person的age是多少呢?先看反编译的结果:

结果为:2

总结

这个题考察还是try-catch-finally的执行顺序,以及引用类型和值类型,这里总结这个,只是换个角度重新学习一下。希望对你有所帮助。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表