ApplicationException在VS 2010中抛出未处理的异常

时间:2014-01-13 00:39:21

标签: c# visual-studio exception-handling

这来自一本书但不会在我的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();
    }
}

2 个答案:

答案 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属性中。