3

使用 Delphi 和 FastReport 我在 Delphi 中调试时收到此错误消息:

<FastReport_Component>.ShowReport(true);

然后出现这个错误:

项目 myapp.exe 引发异常类 EVariantTypeCastError,并带有消息“无法将类型(字符串)的变体转换为类型(双)”。

它在显示报告之前出现两次。但如果我在不调试的情况下运行 myapp,则不会出现错误消息。

如何找到导致此错误的备忘录?报告有很多备忘录。有些在 using 中也有表达式,IIF并且错误消息不会显示更多信息。

4

3 回答 3

13

这只是调试器。它可能只是得到一个预期的错误(由try..exceptFR 代码中的 a 处理)并正确处理它,但调试器无法知道并告诉您发生了异常。(在使用 Indy 时这是一个常见问题,它会在正常程序流程中引发异常。)

调试时有三种处理这种情况的方法:

  1. 只需Continue在出现异常对话框时点击它。(你可以判断它是一个调试器异常,因为你得到了BreakorContinue选项,而且它只在调试时发生。)

  2. 您可以在调试时禁用特定异常类(或所有异常),使用Tools->Options->Debugger Options. 在这种情况下,您可以添加EVariantTypeCastError到要忽略的异常列表中。

  3. (我的首选方法)使用Advanced Breakpoint Properties对话框跳过调试器围绕特定代码行的异常处理,您知道会引发您想要忽略的异常。

    • 在问题代码行之前的行上设置断点。
    • 右键单击前一行的断点,然后Breakpoint Properties从上下文菜单中选择。
    • 单击对话框Advanced上的Breakpoint Properties按钮,然后在Actions组框中,取消选中Break并选中Ignore subsequent exceptions
    • 在问题代码之后的行上重复前面的步骤,除了在第二个断点上选中Break和取消选中。Ignore subsequent exceptions
    • 像往常一样运行你的代码。调试器将跳过它对两个断点之间代码的异常处理。

选项 #3 的优点是它忽略了所有异常处理,但仅在两个断点之间的代码块上,因此您仍然会在代码的所有其他区域中获得异常,这些异常可能是调试器中的有效异常。

于 2013-04-25T23:30:17.673 回答
0

我得到了这个完全相同的错误,但没有使用 FastReport。我将留下我的错误的上下文,因为它可能对其他人有所帮助。我得到了这个错误:

RESTRequest.Execute();

我将 TClientDataSet 与 TRESTResponseDataSetAdapter 一起使用,以便在向我的 Web 服务发出请求后,适配器将使用 Web 服务返回的 JSON 字符串加载数据集。该数据集用于自动选中/取消选中复选框并加载文本编辑和组合框。由于 TJSONObject 无法正确解析 json 中的布尔值,因此我将一些复选框更改为基于整数值而不是布尔值来选中/取消选中。然后我正在更改我的 web 服务,以便它在数据表中查找布尔列为整数值 1 或 0。出于某种原因(完全是我的错),我在该字段中输出了一个带有“”而不是整数(“ 1”或“0”)。这产生了那个确切的错误。更正后,错误消失了。

于 2015-07-09T09:39:11.030 回答
0

我在 FastReport 中遇到了类似的问题。在我的情况下,它是应用于 MemoView 的错误格式。我可以通过这种方式找到有问题的组件的名称:

  • 使用 Break 停止执行
  • 在调用堆栈面板中,找到来自 fastreport 类的最新调用(在我的例子中:frxClass.TfrxCustomMemoView.FormatData(...) 并双击它。
  • 如果您没有快速报告的源代码,则会出现一个对话框 - 只需点击取消
  • 在局部变量面板中,您可能会看到有问题的组件/值/格式的名称。
于 2020-01-22T10:42:07.483 回答