这来自一本书但不会在我的Visual Studio 2010中使用正确的消息进行调试,它只是在throw new ApplicationException("Smth. bad happened", e);
给了我未处理的异常
书中是否有错误,或者我的VS2010异常设置是否可能?控制台输出应该表明,如果文件不存在,内部和外部跟踪将与File Not Found一起打印。它与即时调试有关吗?
电流输出:未处理的异常............................................. ............
期望的输出:http://www.introprogramming.info/wp-content/uploads/2013/07/clip_image008.png
class program
{
static void Main()
{
try
{
string fileName = "WrongFileName.txt";
ReadFile(fileName);
}
catch (Exception e)
{
throw new ApplicationException("Smth. bad happened", e);
}
}
static void ReadFile(string fileName)
{
TextReader reader = new StreamReader(fileName);
string line = reader.ReadLine();
Console.WriteLine(line);
reader.Close();
}
}
答案 0 :(得分:1)
如果你想自己包装一个例外并让它冒泡,你应该删除内部try
,因为每个尝试需要一个匹配的catch
。由于您使用原始异常包装了自己的异常,因此如果您立即捕获它,则无法用于任何目的。
try
{
string fileName = "WrongFileName.txt";
ReadFile(fileName);
}
catch (Exception e)
{
throw new ApplicationException("Smth. bad happened", e);
}
编辑:
这是预期的行为。你明确地抛出一个异常,没有人在处理它。本书可能试图说明您可以包装异常以提供其他信息,同时仍保留原始异常。检查以确保您尝试打开的文件位于正确的位置。
作为补充说明,您应该将文件流包装在using
块中,以确保关闭基础句柄/资源。
static void ReadFile(string fileName)
{
using (TextReader reader = new StreamReader(fileName))
{
string line = reader.ReadLine();
Console.WriteLine(line);
reader.Close();
}
}
答案 1 :(得分:0)
您必须确保文件“WrongFileName.txt”位于项目的Bin / Debug文件夹中(您在项目中包含该文件并将其构建操作设置为Content and Copy always,如果您不希望它抛出异常。
我认为这本书试图表明,当文件名正确时,程序会正常通过,否则会导致错误。
catch
块被运行,因为在这种情况下该文件不存在,因此执行内部操作。这个具体的操作是再次抛出异常但有更多有用的信息。您还可以看到,这个新异常的构造函数接受原始异常作为第二个参数,这意味着它将包含在此异常的InnerException
属性中。