Fehler, Irrtümer, Fragen - Seite 822

 
falkov:

Ja, natürlich, was soll's. Ich habe den Ort allen möglichen Kontrollen unterzogen.

Ich kenne den Ort, ich verstehe nicht, warum das passiert!

Ich prüfe die Array-Größe vor dieser Zeile und andere Variablen auf Ausreißer.

Aber trotzdem stürzt der Expert Advisor ein paar Mal pro Woche ab.

Das ist höchstwahrscheinlich mein Fehler, und ich habe nichts dagegen. Ich bin dagegen, dass ich keine Möglichkeit habe, herauszufinden, wo der Hund begraben ist.

Zugleich gibt es einen einfachen und bequemen Ausschlussmechanismus. Sie wurden genau für solche Fälle eingeführt.

Renat antwortete mir, dass, wenn sie diesen Mechanismus einführen, unkluge Programmierer sofort anfangen werden, Fehler zu machen, und dass sie das dann bereinigen müssen.

Meiner Meinung nach ist das ein lächerliches Argument.

Nun, der Standpunkt von MetaQuotes zu Ausnahmen ist wohlbekannt und unwiderruflich (ich habe vor 2 Jahren selbst mit ihnen darüber gesprochen), also müssen wir uns mit dem begnügen, was wir haben. Es wäre nützlicher gewesen, wenn einige Ihrer Quellen angegeben worden wären.
 

Alternativ zu den Ausnahmen können Sie übrigens auch einen einfachen OnError-Event-Handler implementieren, etwa so:

bool OnError(uint errorcode, string filename, uint lineno, uint colno, string context)
{
  ...
  if(critical)
  {
    return(true); // для подтверждения остановки выполнения скрипта
  }
  else
  {
    return(false); // для продолжения выполнения на чарте (текущий вызов прерывается, но следующие тики/таймеры и пр. работают)
  }
}
 
Verwenden Sie den eingebauten Code-Checker, die gleichen Behauptungen.
 
marketeer:

Alternativ zu den Ausnahmen können Sie übrigens auch einen einfachen OnError-Event-Handler implementieren, etwa so:


Ich denke, das hätte mich zufrieden gestellt, wenn auch nicht vollständig, da ich die erforderlichen Variablen als global deklarieren müsste, um in OnError sichtbar zu sein.

Aber ich wäre trotzdem zufrieden damit. Manchmal muss man einfach nur einen Fehler finden. Nachdem man das Problem gefunden und behoben hat, kann man es wieder im lokalen Bereich verstecken.

Wie würde man diese Idee über OnError an Renat weitergeben?

 
falkov:

Ich glaube, das hat mich zufriedengestellt, wenn auch nicht ganz, denn es wäre notwendig gewesen, die erforderlichen Variablen als global zu deklarieren, um in OnError sichtbar zu sein.

Aber ich wäre trotzdem damit zufrieden gewesen. Man muss nur manchmal einen Fehler finden, und nachdem man das Problem gefunden und behoben hat, kann man sie wieder im lokalen Bereich verstecken.

Wie kann man diese Idee über OnError an Renat weitergeben?

Nicht aus Prinzip. Wenn ein Programm auf einen kritischen Fehler stößt, besteht sein Schicksal nur darin, entladen zu werden.

Jede wichtige Funktion hat Rückgabecodes, alles ist detailliert beschrieben. Daher verliert der Entwickler nicht die Kontrolle über sein Programm.

ps: Es ist natürlich erstaunlich, selbst nach einem eindeutigen Hinweis auf den Ort der Fehlindizierung zu hören: "Nicht genug!".

 
TheXpert:
Verwenden Sie die eingebaute Codeprüfung, die gleichen Behauptungen.

Nun, die Situation hier ist anders. Eine Person hat einen sporadischen Fehler (der unter unklaren Bedingungen selten auftritt). Der Expert Advisor stürzt trotzdem ab. Wenn er Assert setzt, wird er den gleichen Fehler erhalten, aber nicht sofort und es wird nicht klar sein, warum. Deshalb bitte ich ihn, mir den Code zu zeigen.

Und schließlich wäre es hilfreich, wenn bei Fehlern, die zum Anhalten des Skripts führen, nicht nur der Ort, sondern auch der vollständige Kontext angegeben würde: Aufrufstapel, Variableninhalte usw. Sie können eine solche Ausgabe optional machen, indem Sie eine Präprozessor-Direktive verwenden, d.h. eine Fehlerdiagnose-Stufe angeben: lassen Sie es so, wie es ist, aber erlauben Sie, dass es ähnlich ist.

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

Nun, die Situation hier ist anders. Eine Person hat einen sporadischen Fehler (der unter unklaren Bedingungen selten auftritt). Der Expert Advisor stürzt trotzdem ab. Wenn er Assert setzt, wird er den gleichen Fehler erhalten, aber nicht sofort und es wird nicht klar sein, warum. Deshalb bitte ich ihn, mir den Code zu zeigen.

Und schließlich wäre es hilfreich, wenn bei Fehlern, die zum Anhalten des Skripts führen, nicht nur der Ort, sondern auch der vollständige Kontext angegeben würde: Aufrufstapel, Variableninhalte usw. Es ist möglich, eine solche Ausgabe mit Hilfe einer Präprozessor-Direktive optional zu machen, d.h. eine Fehlerdiagnose-Stufe festzulegen: belassen Sie es bei der Standardeinstellung, aber machen Sie es möglich, die Stufe zu erhöhen.

Der gesamte Kontext kann während der Fehlersuche verfolgt werden.

Ein weiterer Punkt ist, dass sporadische Fehler an bestimmten Fragmenten abgefangen werden müssen.

Und genau das ist der Punkt, an dem der Bedarf entsteht. Debugger in der Historie ausführen.

Das Problem ist alt und wurde schon oft angesprochen, aber es ist immer noch da.

 
marketeer:

Nun, die Situation hier ist anders. Eine Person hat einen sporadischen Fehler (der unter unklaren Bedingungen selten auftritt). Der Expert Advisor stürzt trotzdem ab. Wenn er Assert setzt, wird er den gleichen Fehler erhalten, aber nicht sofort und es wird nicht klar sein, warum. Deshalb bitte ich ihn, mir den Code zu zeigen.

95% der sporadischen Fehler haben mit Initialisierungsfehlern oder deren Fehlen zu tun. Ein Codefragment hilft also nicht weiter und der gesamte Code wird Ihnen aus Paranoia nicht die Antwort geben ;-)

Der Grund sollte sehr weit vom Ort der Manifestation entfernt gesucht werden, und es ist langweilig für aphthar, einfach zu fordern, dass die Entwickler erschossen werden. Das wird mit Sicherheit helfen.

// Das wird wirklich helfen, falkov ? : )

 
Urain:

Der gesamte Kontext kann durch Debugging nachverfolgt werden.

Ein weiterer Punkt ist, dass sporadische Fehler bei bestimmten Fragmenten abgefangen werden sollten.

Und genau das ist der Punkt, an dem der Bedarf entsteht. Debugger in der Historie ausführen.

Das Problem ist alt und wurde schon oft angesprochen, aber es ist immer noch da.

Es stimmt auch, dass es unabhängig von der Art des Fehlers eine große Hilfe wäre.
 
marketeer:

Nun, die Situation hier ist anders. Eine Person hat einen sporadischen Fehler (der unter unklaren Bedingungen selten auftritt). Der Expert Advisor stürzt trotzdem ab. Wenn er Assert setzt, wird er den gleichen Fehler erhalten, aber nicht sofort und es wird nicht klar sein, warum. Deshalb habe ich ihn gebeten, mir den Code zu zeigen.

Es macht keinen Sinn, den Code zu zeigen, denn es gibt eine ziemlich komplizierte Logik, die man nicht verstehen muss, und der Fehlerabschnitt selbst ist einfach, aber er gibt nichts her, um den Fehler zu finden, es gibt einen halben Bildschirm mit reinem Code. Jede Variable wird unten und oben auf Begrenzungen geprüft. Wenn die Variable diese Grenzen überschreitet, wird eine Meldung angezeigt, in der alle Variablen und ihre Werte aufgeführt sind. Natürlich liegt irgendwo ein Fehler vor, aber das ist es!!! Ich möchte Sie daran erinnern, dass dies ein- bis zweimal pro Woche geschieht. Der Expert Advisor hat rund um die Uhr gearbeitet.

Und dann bin ich nicht nur an diesem speziellen Fall interessiert, auch wenn es mein erstes Mal ist.

Und eine letzte Sache, vielleicht wäre es nützlich, wenn solche Fehler, die zum Anhalten des Skripts führen, nicht nur mit dem Ort, sondern mit dem vollständigen Kontext versehen würden: Aufrufstapel, Variableninhalt usw. Sie könnten diese Ausgabe optional machen, indem Sie eine Präprozessor-Direktive verwenden, d.h. Sie können die Fehlerdiagnose-Stufe angeben: Lassen Sie sie so wie sie standardmäßig ist, aber erlauben Sie, sie zu erhöhen.

Das wäre großartig! Ein vollständiger Kontext würde es mir sicherlich ermöglichen, den Fehler zu finden! Was ich benötige, ist ein Blick auf die Variablen zum Zeitpunkt des Fehlers, bevor der Expert Advisor das System verlässt.

Lieber Renat! Vielleicht können Sie das tun?

Grund der Beschwerde: