从 C# 代码到 Catch Exception 和 Catch IOException 的 DAG(Program Graph)

From C# code to DAG (Program Graph) for Catch Exception and Catch IOException

我使用以下部分代码,其中相关行由 #number 枚举:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace PS_5
{ 
    Class BinarySearch
    {
        Static void Main (string[] args)
        {
#2      int[] elemArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        .....

#15     StreamWriter sw = null;
            try 
            {
#16             sw = new StreamWriter ("output.txt")
#17.1, 17.2, 17.3               for (int i=0; i<elemArray.Length; i++)
                {
#18                 sw.Write(elemArray[i] + ",");
                }
#19         sw.WriteLine();
            }
#21         catch (IOException ex)
            {
#22             Console.WriteLine (ex.Message)
            }
#23         catch (Exception ex)
            {
#24             Console.WriteLine (ex.Message)
            }
        finally
        {
#25         sw.Flush();
#26         sw.Close();
        }
        }
    }
}

我想将此代码传输到 DAG(程序图)中。 我想问以下问题:

(1) 第 17.3 行(i++)与第 23 行(catch (Exception ex))之间是否存在依赖关系?有没有办法让第 23 行在第 17.3 行之后执行? 据我所知,第 23 行旨在捕获整数 i 的错误。如果超过其最大数量,则不会出现错误,因为 i 将获得其最小值。那么还有一种情况是第23行会在第17.3行之后执行吗?

(2) 我知道第 18 行和第 21 行之间存在依赖关系,因为在第 18 行中我们使用 Write 命令,它是一个 IO,并且 IO 中可能存在异常。但是 Write 命令的内容还包括 elemArray[i]。常规 catch Exception 第 23 行有可能因此 运行 吗?

(3)第21行和第23行之间是否存在依赖关系,是否互斥?我的意思是,如果 catch IOException 有效,那么 Catch Exception 将无效,反之亦然?他们是否共享相同的堆栈来执行错误?

答案:

Q1。从技术上讲,是的:您可能有 整数溢出:

 int i = int.MaxValue;

 checked {
   i++; // <- integer overflow
 }

但是,情况非常不同

Q2。是的,从技术上讲,您可以有 超出范围 异常:如果 elemArray.Length == int.MaxValue 则条件 i<elemArray.Length 始终为真 并且

 int i = int.MaxValue;

 unchecked {
   i++; // <- no integer overflow (thanks to "uncheked"), i is negative now

   var x = elemArray[i]; // <- Out of range (since i is negative)
 }     

这是一个与第一个案例非常不同的案例。

Q3。是的,它们是互斥的,其中 catch (IOException ex) 被称为 catch (Exception ex) 或 none。

提示:您可能会发现 Linq 是一个更好的解决方案,而不是读者、流的那些东西:

  File.WriteAllText("output.txt", String.Join(",", lemArray));