错误、漏洞、问题 - 页 822

 
falkov:

是的,当然,那又怎样。我在这里贴满了各种支票。

我知道这个地方,我不明白为什么会发生这种情况!我不知道。

我检查了这一行之前的数组大小和其他变量的异常值。

但专家顾问每周仍会崩溃几次。

这很可能是我的错误,我也不反对。我反对的是,我没有任何机制去寻找狗的埋葬地点。

同时,还有一个简单而方便的排除机制。它们就是为这种情况而推出的。

雷纳特回答我说,如果他们引入这种机制,不明智的程序员会立即开始犯错,他们将不得不进行清理。

在我看来,这是一个可笑的说法。

好吧,MetaQuotes对例外情况的立场是众所周知的,也是不可改变的(两年前我自己和他们讨论过),所以我们只是用我们拥有的东西来做。如果能展示你的一些资料来源,会更有用。
 

顺便说一下,作为异常的替代,你可以实现一个简单的OnError事件处理程序,像这样。

bool OnError(uint errorcode, string filename, uint lineno, uint colno, string context)
{
  ...
  if(critical)
  {
    return(true); // для подтверждения остановки выполнения скрипта
  }
  else
  {
    return(false); // для продолжения выполнения на чарте (текущий вызов прерывается, но следующие тики/таймеры и пр. работают)
  }
}
 
使用内置的代码检查器,同样的断言。
 
marketeer:

顺便说一下,作为异常的替代,你可以实现一个简单的OnError事件处理程序,像这样。


我想这就能让我满意了,虽然不是完全满意,因为我需要将所需变量声明为全局变量,以便在OnError中可见。

但无论如何我都会很高兴。有时你只需要抓住一个错误,在找到并解决了问题之后,你可以再次将它们隐藏在本地。

如何向Renat传达这个关于OnError的想法?

 
falkov:

我想这让我很满意,虽然不是完全满意,因为有必要将所需的变量声明为全局变量,以便在OnError中可见。

但无论如何我都会很高兴。你只是有时需要抓住一个错误,在找到并解决了问题之后,你可以再次将它们隐藏在本地。

如何将这个关于OnError的想法传递给Renat?

这不是一个原则问题。如果一个程序遇到了严重的 错误,其命运只能是被卸载。

每个重要的功能都有返回代码,一切都很详细。因此,开发者并没有失去对其程序的控制。

ps:当然,即使在明确指出错误的索引位置之后,还能听到 "不够!",这是很了不起的。

 
TheXpert:
使用内置的代码检查器,同样的断言。

那么,这里的情况是不同的。一个人有一个零星的错误(在不明确的条件下很少再现)。专家顾问还是崩溃了。如果他设置了Assert,他将得到同样的错误,但不是立即得到,也不清楚为什么。这就是为什么我要求他给我看代码。

最后,如果这种导致脚本停止的错误不仅有位置,而且有完整的上下文:调用堆栈、变量内容等,可能会有帮助。你可以使用预处理器指令 使这种输出成为可选项,即指定错误诊断级别:默认情况下保持原样,但允许类似。

Документация по MQL5: Основы языка / Препроцессор
Документация по MQL5: Основы языка / Препроцессор
  • www.mql5.com
Основы языка / Препроцессор - Документация по MQL5
 
marketeer:

那么,这里的情况是不同的。一个人有一个零星的错误(在不明确的条件下很少再现)。专家顾问还是崩溃了。如果他设置了Assert,他将得到同样的错误,但不是立即得到,也不清楚为什么。这就是为什么我要求他给我看代码。

最后,如果这种导致脚本停止的错误不仅有位置,而且有完整的上下文:调用堆栈、变量内容等,可能会有帮助。可以使用预处理器指令 使这种输出成为可选项,即指定错误诊断级别:默认情况下保持不变,但要使其可以递增。

在调试过程中可以追踪到完整的上下文。

另一点是零星的错误必须在某些片段被抓住。

而这正是需求产生的地方。 在历史上运行调试器.

这个问题是老问题了,已经被提出过很多次了,但它仍然存在。

 
marketeer:

那么,这里的情况是不同的。一个人有一个零星的错误(在不明确的条件下很少再现)。专家顾问还是崩溃了。如果他设置了Assert,他将得到同样的错误,但不是立即得到,也不清楚为什么。这就是为什么我要求他给我看代码。

95%的零星错误都与初始化错误或缺乏初始化有关。 因此,一个 代码片段不会有帮助,整个代码也不会因为偏执而有帮助;-)

应该在离表现的地方很远的地方寻找原因,阿法尔只是要求把开发商枪毙,这很无聊。这肯定会有帮助。

// 这真的会有帮助,falkov ?)

 
Urain:

完整的上下文可以通过调试进行追踪。

另一件事是,零星的错误应该在某些片段中被抓住。

而这正是需求产生的地方。 在历史上运行调试器.

这个问题是老问题了,已经提出过很多次了,但它仍然存在。

也对,无论错误的性质如何,它都会有很大的帮助。
 
marketeer:

那么,这里的情况是不同的。一个人有一个零星的错误(在不明确的条件下很少再现)。专家顾问还是崩溃了。如果他设置了Assert,他将得到同样的错误,但不是立即得到,也不清楚为什么。这就是为什么我要求他给我看代码。

显示代码没有意义,因为有相当复杂的逻辑,谁需要了解它,错误部分本身很简单,但它没有给出任何发现错误的方法,有半屏的纯代码。每个变量都要在底部和顶部检查边界。如果变量超过了这些限制,就会显示一条信息,列出所有的变量和它们的值。当然,某处有错误,但这就是错误所在!!!。让我提醒你,它每周发生一到两次。专家顾问一直在昼夜工作。

然后我不仅对这个特定的案例感兴趣,虽然这是我第一次。

最后一点,如果这种导致脚本停止的错误不仅有位置,而且有完整的上下文:调用栈、变量内容等,也许会很有用。你可以使用预处理器指令 使这种输出成为可选项,即指定错误诊断级别:默认情况下保持原样,但允许使其更加复杂。

这将是非常好的!一个完整的上下文肯定能让我找到错误!我需要的是在错误发生时,在专家顾问离开之前查看变量。

亲爱的Renat!也许你可以这样做?