从 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));
我使用以下部分代码,其中相关行由 #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));