2013-02-20 87 views
6

我研究了this article on MSDN,以及关于此主题的一些关于SO的问题/答案,但无法确定为什么下面的代码不起作用(在示例控制台应用程序中)。如何使用调试程序处理任务中的异常?

根据MSDN,预计会抛出AggregateException,该消息将包含一个带有hello消息的内部异常。相反,这个hello异常是未处理的。它发生在调试器内部时。

如果按继续或独立运行,它按预期工作。有什么办法可以避免在VS中一直持续按下?毕竟,在单线程编程模型中,Try...Catch块中的任何内容都被认为是处理的。否则,调试可能是一场噩梦。

VB.NET

Sub Main() 
    Try 
    Task.Factory.StartNew(AddressOf TaskThatThrowsException).Wait() 
    Catch ex As AggregateException 
    Console.WriteLine(ex.ToString) 'does not get here until you hit Continue 
    End Try 
End Sub 

Private Sub TaskThatThrowsException() 
    Throw New Exception("hello") 'exception was unhandled 
End Sub 

C#

namespace ConsoleApplication1 { 
    class Program { 
    static void Main(string[] args) { 
     try { 
     Task.Factory.StartNew(TaskThatThrowsException).Wait(); 
     } 
     catch (AggregateException ex) { 
     Console.WriteLine(ex.ToString()); //never gets here     
     } 
    } 

    static void TaskThatThrowsException() { 
     throw new Exception("hello"); //exception was unhandled    
    } 
    } 
} 

有什么明显的,我在这里失踪?

+0

设置调试器停止对所有异常。它停在哪里?它应该停在'TaskThatThrowsException'和'Wait'中。 – usr 2013-02-20 22:25:28

+0

@usr:即使现在它停止在抛出新的异常(“你好”)线,检查所有投掷并没有使它变得更好。我希望它不止于此,而是处理Console.WriteLine。否则,调试可能是一场噩梦。 – Neolisk 2013-02-21 02:31:45

+0

任务异常不会出现在StartNew中,只出现在.Wait()中。 Dim myTask = Task.Factory.StartNew(...)试试MyTask.Wait()Catch ... – adrianm 2013-02-21 13:21:31

回答

2

设置“启用我的代码”对此有影响。在工具 - >选项,调试 - >常规 - >启用只是我的代码。如果你打开它,它会认为你的代码没有处理它,如果未处理。尝试关闭此选项。

参见: http://msdn.microsoft.com/en-us/library/dd997415.aspx

+0

+1。因此,对于这种特定情况,Microsoft建议使用这种方法。猜猜下次我应该更仔细地阅读MSDN,因为我确信在问这个问题之前,我快速浏览了这个特定的页面。非常感谢! – Neolisk 2013-02-21 19:07:26

2

这很可能是因为您误解了Visual Studio对话框所说的内容。

例外情况是“用户未处理”,因为没有捕获它的用户代码(原始的Exception),它被TPL捕获。因此,如果让调试器继续运行,或者如果您在没有调试器的情况下运行应用程序,则会看到您期望的行为。

+0

+1。那么,除了正常的例外情况,如果在“Try ... Catch”块内(并且类型对应,并且不会重新排列),它们将被视为已处理。我还应该如何调试我的应用程序?按类似情况下一直按下继续?有什么办法让VS在调试时不捕获这些异常? – Neolisk 2013-02-20 23:15:00

+1

@Neolisk调试 - >异常 - >取消选中投掷 – Marc 2013-02-20 23:20:36

+0

@Marc:投掷已经无处不在。 – Neolisk 2013-02-21 02:10:58