【问题标题】:ApplicationException throws unhandled exception in VS 2010ApplicationException 在 VS 2010 中抛出未处理的异常
【发布时间】:2014-01-13 00:39:20
【问题描述】:

这来自一本书,但不会在我的 Visual Studio 2010 中使用正确的消息进行调试,它只会在 throw new ApplicationException("Smth. bad happened", e); 处给我未处理的异常 书中有错误还是我的VS2010异常设置可能?控制台输出应该显示如果文件不存在,内部和外部跟踪将与未找到文件一起打印。它与即时调试有关吗? 当前输出:未处理的异常............................................................ ………… 所需输出: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();
    }
}

【问题讨论】:

  • 您需要了解编译失败的代码和运行失败的代码之间的区别。它编译,它不应该运行。
  • 我使用了错误的术语 - 它无法使用正确的控制台输出正确编译。因此,如果您能帮助我获得正确的输出 Unhandled Exception: Exception1: Msg1 ---> Exception2: Msg2 而不是只有异常,我将不胜感激。
  • 我的代码无法输出消息 - 很明显,出于教育目的存在未处理的异常。我的目标不是编译,而是显示书中所示的内部堆栈跟踪。

标签: c# visual-studio exception-handling


【解决方案1】:

如果您想自己包装异常并让它冒泡,您应该删除内部的try,因为每个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();
    }
}

【讨论】:

  • 我会编辑我的帖子,这不是问题,感谢您指出我的错误复制,现在它已被编辑。
  • 更新了我的回复@PetarDrianov
  • 输出应该显示如果文件不存在,内部和外部跟踪将与未找到文件一起打印。抱歉,您的回答对我没有帮助。请查看我的问题,因为我已向其中添加了一些信息:输出应该显示鉴于文件不存在,内部和外部跟踪将与未找到文件一起打印。
  • 运行此代码确实会在控制台输出窗口中打印外部和内部异常,并抛出FileNotFoundException。如果您没有看到它被打印出来,请尝试在没有附加调试器的情况下运行该应用程序。 @PetarDrianov
  • 这是我的问题,答案是否定的。它不会在没有调试器的情况下打印(只是运行 exe 文件)。所以你标记我了,请撤消它。这是我想要的输出:introprogramming.info/wp-content/uploads/2013/07/…
【解决方案2】:

您必须确保文件“WrongFileName.txt”位于项目的 Bin/Debug 文件夹中(您将文件包含在项目中并将其构建操作设置为内容并始终复制,如果您不希望它这样做抛出异常。

我想这本书是想说明,当文件名正确时,程序会正常通过,否则会出错。

catch 块被运行,因为在这种情况下文件不存在,因此内部的操作被执行。这个具体的操作是再次抛出异常,但提供更多有用的信息。您还可以看到,这个新异常的构造函数接受原始异常作为第二个参数,这意味着它将包含在此异常的InnerException 属性中。

【讨论】:

  • 抱歉,您不明白这本书想要表达的意思。输出应该显示给定文件不存在,内部和外部跟踪将与 File Not Found 一起打印。
  • 这正是真正发生的事情:-)。如果您看到抛出的异常,它包含所有这些信息,但程序崩溃,因为没有任何东西可以捕获它。如果您想安全地输出结果,则必须将整个 Main 方法的主体包含在一个新的 try-catch 块中,并在 catch 部分将异常跟踪输出到控制台
  • 我没有成功将 main 方法包含在 try catch 块中,我认为这不是您应该做的,如果 innerException 参数不是空引用,则当前异常在处理内部异常的 catch 块中引发。如果你能告诉我怎么做,我将不胜感激,这是输出的链接:introprogramming.info/wp-content/uploads/2013/07/…
  • 您到底需要什么?内部和外部痕迹显示在您发送的图像上,所以我无法理解这一点:-)。
  • 这是我没有得到的。
猜你喜欢
  • 1970-01-01
  • 2011-10-10
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多