如何在Visual Studio中调试finally块?

问题描述:

如何在出现未捕获异常的情况下调试try {...} finally{...}中的finally块?似乎无论我如何处理异常设置或调试器,Visual Studio都不会让我继续执行try块中抛出的异常点,以便调试finally代码。如何在Visual Studio中调试finally块?

这里的一个代表,短例如:

public static void Main() 
{ 
    var instrument = new Instrument(); 
    try 
    { 
     instrument.TurnOnInstrument(); 
     instrument.DoSomethingThatMightThrowAnException(); 
     throw new Exception(); // Visual Studio won't let me get past here. Only option is to hit "Stop Debugging", which does not proceed through the finally block 
    } 
    finally 
    { 
     if(instrument != null) 
      instrument.TurnOffInstrument(); 
    } 
} 

上下文:我具有控制用于拍摄电子测量在实验室一些硬件工具,例如一个程序可编程的PSU。如果出现问题,我希望它快速失效:首先关闭仪器以防止可能的物理损坏,然后退出。关闭它们的代码位于finally块中,但我无法调试此代码在错误情况下的工作方式。我不想尝试处理任何可能的错误,只需将仪器关闭,然后关闭程序。也许我正在以这种错误的方式去做?

+5

有你把'finally'块中的一行断点? – hometoast

+2

你能告诉我们一个你的代码的小例子吗?如果你想捕获所有异常而不用担心它们被捕获,那么你将需要为'Exception'类添加一个catch块。 –

+0

作为一个侧面说明,我并不认为使用PC来例如PWM控制一个H桥。 任何异常情况,或只是交换,死锁等等,你可能会停下来打开MOSFET/IGBT。 当然,这可能会也可能不像您的使用案例。 – Victor

一个最后,如果在应用程序崩溃的异常结果,即在案件永远不会执行块你码。 要调试您为例finally块,你必须把你的主要功能的整个代码在其他try语句,并捕获该异常,以防止应用程序崩溃,就像这样:

public static void Main() 
{ 
    try 
    { 
     var instrument = new Instrument(); 
     try 
     { 
      instrument.TurnOnInstrument(); 
      instrument.DoSomethingThatMightThrowAnException(); 
      throw new Exception(); 
     } 
     finally 
     { 
      if(instrument != null) 
       instrument.TurnOffInstrument(); 
     } 
    } 
    catch(Exception) 
    { 
     Console.Writeline("An exception occured"); 
    } 
} 

您需要在的第一行finally块的第一行放置一个断点,然后在异常后再次单击“运行”。

+1

这不起作用,当引发异常时我得到“Exception was unhandled。一个未处理的异常类型'System.Exception发生在”Blah.exe“”。点击运行只是重复这一点。 –

+0

当然,如果仪器为空,断点在您的示例中绝不会触发。 我会添加一些静态无条件代码来测试断点。 – Victor

+0

这仅仅是一个例子,如果我把它放在'if块'本身上,断点就会打。但是执行永远不会前进到finally块,所以这是一个有争议的问题。 –

  1. 您可以设置断点(F9键)和Alt + Ctrl + B键来查看断点列表。
  2. 可以打破使用的IntelliTrace之间,如:

    Set IntelliTrace Settings

+1

感谢您的详细步骤,但是Visual Studio 2015 Pro SKU不具有Intellitrace,对于这种情况,这不应该是必需的。另外,我知道如何设置/查看断点。即使是单步执行,代码执行也不会超过异常抛出,所以如果代码永远不会到达那里,那么设置断点并不会有帮助。 –