【问题标题】:C# Pragma to suppress break on thrown errorC# Pragma 抑制抛出错误时的中断
【发布时间】:2010-03-25 06:53:29
【问题描述】:

首先,我运行我的应用程序,任何错误(处理与否)都会引发异常。

其次,我使用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;
    }
}

我发现每次输入--1 或其他一些无效字符时都执行VS 中断会让人分心。我可以使用类似于this 的东西,但不是所有我要转换为TryParse 方法的类型。

我希望有一些方法可以在不更改我的异常设置的情况下禁用 try 中代码部分的中断。

【问题讨论】:

  • 这是一个调试器选项,不是编译器选项。

标签: c# exception-handling pragma


【解决方案1】:

将 try/catch 放到它自己的方法中,并在方法上设置这个属性:

[System.Diagnostics.DebuggerNonUserCode]

调试器不会在该方法内停止(即使是断点)。当方法完成时,异常已经被处理,所以它也不会在那个时候中断。

【讨论】:

  • 好调用,这解决了我的问题(我有数百个 ArgumentNull 可能会抛出,一个非常频繁,两个非常模糊。通过在它经常抛出的地方设置这个属性(我处理了它已经在那里),当整个逻辑循环有一个包装处理程序时,我可以找到它正在抛出的其他地方,谢谢!
  • 请注意,这不适用于通过 LINQ 查询调用的语句,无论如何调试器都会介入。
【解决方案2】:

在 Debug -> Exceptions 菜单下,您可以关闭任何特定异常类型的中断。

【讨论】:

  • 但是如果你想要一个“我想打破抛出的 FormatException 的逻辑,除非这个代码块抛出它,因为我已经在那里处理了它所以我不在乎 - 我想要一个它正在扔的其他地方”
  • VS 2017 向异常窗口添加了条件。我没有使用它,所以我不知道它是否能处理你所说的情况,但它可能值得一看。
【解决方案3】:

不是直接的答案,但您可以在尝试使用 TypeConverter 之前创建一个对字符串值进行完整性检查的方法,然后对其应用 Conditional("DEBUG") 属性 - 所以生产代码继续使用 TypeConverter(并捕获所有失败的情况),同时在调试时,在点击 TypeConverter 之前发现并避免常见错误。

通过应用条件,您可以完全避免在代码的发布版本中使用此代码 - 它只是为了捕捉当前正在出现的常见错误。

【讨论】:

    【解决方案4】:

    我不确定我是否完全遵循您的问题,但如果您想在特定异常上禁用 VS 中断,您可以使用“异常”对话框 (ctrl-alt-e) 自定义它。打开公共语言运行时异常树并向下钻取特定异常并将其关闭。 FormatException 位于系统下。这样 VS 将在除 FormatException 之外的所有托管异常上中断。

    【讨论】:

    • 这确实是我正在寻找的效果,不幸的是它抛出了 System.Exception 而不是 FormatException。我希望仍然能够打破所有问题,除非它发生在明确定义的代码区域内(见编辑)。
    • 但这会关闭所有此类异常的抛出。如果您的程序可能在 100 个地方抛出 FormatException,并且您首先添加了一个 try/catch,但那是在1000 个项目的循环,在它被扔到其他地方之前。我猜 OP 想说“我想打破抛出的 FormatException,除非这个......代码块抛出它”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2013-03-13
    • 2021-06-07
    • 1970-01-01
    相关资源
    最近更新 更多