• [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的执行顺序,以及引用类型和值类型,这里总结这个,只是换个角度重新学习一下。希望对你有所帮助。

  • 相关阅读:
    速耀达ERP系统部署实施文档目录(速达开发版本)
    解决 Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. 的问题
    速耀达表单数据导出导入(速达二次开发)
    速耀达软件和脚本升级(速达二次开发)
    速耀达3系列操作员业务员权限解析(速达二次开发)
    App穿透服务注册(速达二次开发)
    App启用在线配置功能(速达二次开发)
    速耀达App简介
    iis浏览只显示目录浏览的处理方式(速达二次开发)
    单据界面布局配置(速达二次开发)
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/3550785.html
Copyright © 2020-2023  润新知