2010-03-25 31 views
3

首先,我运行我的应用程序时抛出任何错误(处理或不处理)的异常。C#Pragma抑制引发错误的中断

其次,我正在使用TypeConverter将用户输入字符串转换为实际对象。

TypeConverter没有提供TryConvert方法,所以我坚持使用验证异常,这里使用这个代码比较难看位:

try 
{ 
    this._newValue = null; 
#pragma Magic_SuppressBreakErrorThrown System.Exception 
    this._newValue = this.Converter.ConvertFromString(this._textBox.Text); 
#pragma Magic_ResumeBreakErrorThrown System.Exception 
    this.HideInvalidNotification(); 
} 
catch (Exception exception) 
{ 
    if (exception.InnerException is FormatException) 
    { 
     this.ShowInvalidNotification(this._textBox.Text); 
    } 
    else 
    { 
     throw; 
    } 
} 

我发现它,而分心有VS破执行任何─我输入--1,或其他一些无效字符。我可以使用类似于this的东西,但不是我转换的所有类型都有TryParse方法。

我希望可以通过某种方式来禁用try中的代码段,而不更改我的例外设置。

+0

这是一个调试器选项,而不是编译器选项。 – leppie 2010-03-25 11:28:31

回答

1

我不确定我是否完全遵循了你的问题,但是如果你想禁用特定异常的VS中断,你可以使用异常对话框(ctrl-alt-e)来定制它。打开公共语言运行时异常树并深入查找特定的异常,然后关闭该异常。 FormatException位于System下。这种方式VS将打破除FormatException外的所有托管异常。

+1

这确实是我正在寻找的效果,不幸的是它会抛出System.Exception而不是FormatException。我希望仍然能够打破所有,除非它发生在明确定义的代码区域内(请参阅编辑)。 – 2010-03-25 11:18:08

+0

但是,这会关闭所有类型的异常。如果程序可能在可能的100个位置抛出FormatException,并且为第一个位置添加try/catch,但是在1000个项目的循环之前被扔到别的地方。我想这个OP想说的是“我想打破FormatException抛出异常,当这...代码块抛出它“ – 2017-04-27 18:20:16

1

在Debug - > Exceptions菜单下,您可以打开任何特定的异常类型。

+0

但是,如果你想要一个逻辑“我想打破FormatException抛出异常,当这个代码块抛出它,因为我已经在那里处理它,所以我不在乎 - 我想要扔在其他地方之一” – 2017-04-27 18:21:13

+0

VS 2017向异常窗口添加了条件。我没有使用它,所以我不知道它是否会处理你谈论的情况,但它可能值得一看。 – 2017-04-28 19:04:34

0

不是直接的答案,但是您可以创建一种方法,在尝试使用TypeConverter之前对字符串值进行健全性检查,然后对其应用条件(“DEBUG”)属性 - 以便生产代码继续并使用TypeConverter(并捕获所有失败的案例),同时在调试时,在触及TypeConverter之前拾取并避免常见错误。

通过应用条件,你避免这个代码在所有在你的代码的发行版使用 - 它只是没有赶上这是目前匍匐在常见的错误

13

把try/catch语句在它的。自己的方法,并设置该属性的方法:

[System.Diagnostics.DebuggerNonUserCode] 

调试器将在该方法(甚至断点)内停止。当方法结束时,异常已经被处理,所以它在那个时候也不会中断。

+0

好的调用,这解决了我的问题(我有数百个参数ArgumentNull可能抛出,而且其中一个很常见,两个非常模糊。通过在经常抛出的地方设置此属性(我处理它已经),当整个逻辑循环有一个包装处理程序时,我可以找到它抛出的其他地方,谢谢! – 2017-04-27 18:22:38