【问题标题】:In Try - Catch how the line of error can be found在 Try - Catch 如何找到错误行
【发布时间】:2013-07-22 14:55:51
【问题描述】:

我们正在使用视觉工作室。在 try & catch 的情况下,我们无法准确定位引发错误的代码行。就好像我们使用简历一样,会显示确切的行,我们可以在那里进行更正并进行测试。在许多情况下,有时在测试环境中重现错误可能是不可能的。当抛出错误时,我们必须至少在其中找到错误本身。此外,如果程序很大,比如有 400 多行,那么在没有错误行的情况下定位错误是一件很头疼的事情。当 try catch 被认为优于 on error 语句时,为什么这个特性不可用?当我们使用 vb6 时,我们可以输入 resume 并检查错误行。在 vb.net 中,我们正在搜索该功能。

【问题讨论】:

  • 您为什么不向我们展示您已经尝试过的内容?尽管如此,您可以Catch(最好)特定Exceptions 并使用他们的方法(例如:.StrackTrace)返回异常相关数据。
  • 在主文件菜单中打开“Debug”,然后在对话框中打开“Exceptions...”,找到名为“Common Language Runtime Exceptions”的条目并选中“Thrown”列中的复选框。 Visual Studio 现在将在引发任何 CLR 异常时中断,而不是仅在未处理的异常时中断。
  • 如果过程有 400 行代码,您可能会考虑“过程代码”——VB.net 是面向对象的,而 VB6 不是。使用 OOP,您应该编写许多小对象,它们只做一件事并且做得很好。 400 行做一件事似乎不太可能。我已经看到 VB6 中的 1200-liner procedures 变成了 .net 中的 10-liner methods; 10 行比 1200 更容易理解...

标签: vb.net visual-studio-2008 error-handling try-catch onerror


【解决方案1】:

试试这个:

  1. 转到“调试”菜单。
  2. 点击例外...选项。
  3. 应出现以下对话框:

注意公共语言运行时异常复选框已选中。

单击“确定”后,现在当您在代码或 .NET Framework 引发异常时调试代码时,调试器将在引发异常的行停止。这样可以更轻松地找到“损坏”的地方。

【讨论】:

  • 抛出和用户处理有什么区别?我正在使用 Visual Studio 2008 速成版。
  • Thrown 使调试器停止在实际异常发生的行,而用户处理的代码在同一方法或其他地方,因为异常冒泡,直到有东西处理异常;如果您的代码未处理,最终 .NET Framework 将处理异常并为您显示错误页面。
  • 如果我在 debug->Exception 菜单中将其设置为“throw”,那么它在构建项目后是否也会影响我的项目?或者它是否会影响我创建的 exe?另外,如果我将两者都设置为抛出并由用户处理怎么办?
  • 如果我使用 pdb 文件在堆栈跟踪中给出行号怎么办。它是否包含我的整个代码,可以很容易地看到?
  • 不,这完全是 Visual Studio 的设置,不影响内置的.exe。如果您同时设置两者,那么Thrown 将胜过User Handled,因为throw 发生在catch 之前。由于这发生在 Visual Studio 内部,您将自动被置于 throw 发生的行号上,并且调试器将处于活动状态,因此您可以使用正常的调试功能(局部变量、即时窗口、鼠标悬停变量等)。
【解决方案2】:

在 VB6 中,Err 对象相当原始,它为您提供有关错误的基本信息 - 数字和消息。 “错误”状态很容易消除 (On Error Resume Next),正确的错误处理会掩盖任何方法的意图。

.NET 异常更加复杂。它们是特殊对象,实际上可以包含定位错误所需的每一位可用信息 - 包括导致错误的特定代码行。

这是因为异常冒泡直到它们被捕获(在 catch 块中),如果没有,它们就未处理 并导致程序停止。异常不仅包含带有描述的错误类型和引发它的代码行,还包含导致它的每个调用——在 VB6 中这样做需要大量的细致的“堆栈跟踪”构建很容易开始撒谎,并且不会给你确切的行号。 .NET 堆栈跟踪永远不会说谎。

要查看堆栈跟踪,您可以在任何 catch 块中放置断点并查看异常的属性。

您不能像在 VB6 中那样恢复,因为在引发异常的行和捕获异常的行之间可能有几十个方法调用。但是,就像在 VB6 中一样,您可以将黄色的“当前指令”标记移动到另一行并恢复执行,然后逐行 (F10) 重新运行 try 块以查看发生了什么问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-27
    • 1970-01-01
    • 2012-11-22
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    相关资源
    最近更新 更多