Errori, bug, domande - pagina 822

 
falkov:

Sì, certo, e allora? Ho sottoposto il posto a tutti i tipi di controlli.

Conosco il posto, non capisco perché succede!

Controllo la dimensione dell'array prima di questa linea e altre variabili per i valori anomali.

Ma ancora l'Expert Advisor va in crash un paio di volte a settimana.

Questo è molto probabilmente un mio errore, e non sono contrario. Sono contrario al fatto che non ho nessun meccanismo per scoprire dove è sepolto il cane.

Allo stesso tempo, c'è un meccanismo di esclusione semplice e conveniente. Sono stati introdotti proprio per questi casi.

Renat mi ha risposto che se introducono questo meccanismo, i programmatori sprovveduti inizieranno immediatamente a fare errori e dovranno ripulirlo.

Questo è un argomento ridicolo, secondo me.

Beh, la posizione di MetaQuotes sulle eccezioni è ben nota e irrevocabile (ne ho discusso con loro io stesso 2 anni fa), quindi ci accontentiamo di quello che abbiamo. Sarebbe stato più utile se fosse stata mostrata qualche vostra fonte.
 

A proposito, come alternativa alle eccezioni, si potrebbe implementare un semplice gestore di eventi OnError, come questo:

bool OnError(uint errorcode, string filename, uint lineno, uint colno, string context)
{
  ...
  if(critical)
  {
    return(true); // для подтверждения остановки выполнения скрипта
  }
  else
  {
    return(false); // для продолжения выполнения на чарте (текущий вызов прерывается, но следующие тики/таймеры и пр. работают)
  }
}
 
Usate il controllore di codice integrato, le stesse asserzioni.
 
marketeer:

A proposito, come alternativa alle eccezioni, si potrebbe implementare un semplice gestore di eventi OnError, come questo:


Penso che questo mi avrebbe soddisfatto, anche se non completamente, poiché avrei avuto bisogno di dichiarare le variabili richieste come globali per essere visibili in OnError.

Ma ne sarei felice comunque. A volte hai solo bisogno di catturare un errore, dopo aver trovato e risolto il problema puoi nasconderlo di nuovo in locale.

Come si potrebbe trasmettere questa idea di OnError a Renat?

 
falkov:

Penso che mi abbia soddisfatto, anche se non completamente, perché sarebbe stato necessario dichiarare le variabili richieste come globali per essere visibili in OnError.

Ma ne sarei stato felice comunque. Hai solo bisogno di catturare un errore a volte, dopo aver trovato e risolto il problema potresti nasconderli di nuovo in locale.

Come portare questa idea di OnError a Renat?

Non per una questione di principio. Se un programma incorre in un errore critico, il suo destino è solo quello di essere scaricato.

Ogni funzione importante ha dei codici di ritorno, tutto è dettagliato. Pertanto, lo sviluppatore non perde il controllo del suo programma.

ps: è sorprendente, naturalmente, sentire "non abbastanza!" anche dopo una chiara indicazione del luogo dell'errata indicizzazione.

 
TheXpert:
Utilizzare il controllo del codice integrato, le stesse asserzioni.

Bene, la situazione qui è diversa. Una persona ha un errore sporadico (riprodotto raramente in condizioni poco chiare). L'Expert Advisor si blocca comunque. Se imposta Assert, otterrà lo stesso errore ma non immediatamente e non sarà chiaro perché. Per questo gli chiedo di mostrarmi il codice.

E infine, potrebbe essere utile se tali errori che causano l'arresto dello script fossero accompagnati non solo dalla posizione, ma dal contesto completo: stack delle chiamate, contenuto delle variabili, ecc. Potete rendere tale output opzionale usando una direttiva del preprocessore, cioè specificare il livello di diagnostica degli errori: lasciatelo com'è di default ma permettete che sia simile.

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

Bene, la situazione qui è diversa. Una persona ha un errore sporadico (riprodotto raramente in condizioni poco chiare). L'Expert Advisor si blocca comunque. Se imposta Assert, otterrà lo stesso errore ma non immediatamente e non sarà chiaro perché. Per questo gli chiedo di mostrarmi il codice.

E infine, potrebbe essere utile se tali errori che causano l'arresto dello script fossero accompagnati non solo dalla posizione, ma dal contesto completo: stack delle chiamate, contenuto delle variabili, ecc. È possibile rendere tale output opzionale usando una direttiva del preprocessore, cioè specificare il livello di diagnostica degli errori: lasciarlo com'è di default, ma rendere possibile incrementarlo.

Il contesto completo può essere tracciato durante il debug.

Un'altra cosa è che gli errori sporadici devono essere presi in certi frammenti.

Ed è qui che nasce la necessità. Eseguire il debugger sulla storia.

Il problema è vecchio ed è stato sollevato molte volte, ma è ancora lì.

 
marketeer:

Bene, la situazione qui è diversa. Una persona ha un errore sporadico (riprodotto raramente in condizioni poco chiare). L'Expert Advisor si blocca comunque. Se imposta Assert, otterrà lo stesso errore ma non immediatamente e non sarà chiaro perché. Per questo gli chiedo di mostrarmi il codice.

Il 95% degli errori sporadici sono legati a errori di inizializzazione o mancanza di essa. Quindi, un frammento di codice non aiuterà e l'intero codice non vi darà la risposta per paranoia ;-)

La ragione va cercata molto lontano dal luogo della manifestazione, ed è noioso per l'aphthar chiedere solo che gli sviluppatori vengano fucilati. Aiuterà di sicuro.

// Sarà davvero utile, falkov? : )

 
Urain:

Il contesto completo può essere tracciato dal debug.

Un'altra cosa è che gli errori sporadici dovrebbero essere presi in certi frammenti.

Ed è qui che nasce la necessità. Eseguire il debugger sulla storia.

Il problema è vecchio ed è stato sollevato molte volte, ma è ancora lì.

Anche vero, aiuterebbe molto indipendentemente dalla natura dell'errore.
 
marketeer:

Bene, la situazione qui è diversa. Una persona ha un errore sporadico (riprodotto raramente in condizioni poco chiare). L'Expert Advisor si blocca comunque. Se imposta Assert, otterrà lo stesso errore ma non immediatamente e non sarà chiaro perché. Ecco perché gli ho chiesto di mostrarmi il codice.

Non ha senso mostrare il codice, perché c'è una logica abbastanza complicata, chi ha bisogno di capirla, e la sezione di errore stessa è semplice, ma non dà nulla per trovare l'errore, c'è una mezza schermata di puro codice. Ogni variabile è controllata per i limiti in basso e in alto. Se la variabile supera questi limiti, viene visualizzato un messaggio che elenca tutte le variabili e i loro valori. Ovviamente c'è un errore da qualche parte, ma è lì che si trova!!! Lasciate che vi ricordi che succede una o due volte alla settimana. L'Expert Advisor ha lavorato 24 ore su 24.

E poi sono interessato non solo a questo caso particolare, anche se è la mia prima volta.

E un'ultima cosa, forse sarebbe utile se tali errori che causano l'arresto dello script fossero accompagnati non solo dalla posizione, ma dal contesto completo: stack delle chiamate, contenuto delle variabili ecc. Si potrebbe rendere tale output opzionale usando una direttiva del preprocessore, cioè specificare il livello di diagnostica degli errori: lasciarlo com'è di default, ma permettere di renderlo più complesso.

Sarebbe fantastico! Un contesto completo mi permetterebbe certamente di trovare l'errore! Quello di cui ho bisogno è di guardare le variabili al momento dell'errore, prima che l'Expert Advisor parta.

Caro Renat! Forse puoi fare questo?