Domanda

C'è un buon modo per scoprire che le eccezioni di una procedura/funzione può aumentare in Delphi (tra cui si chiama procedure/funzioni)?

In Java devi sempre dichiarare che le eccezioni che possono essere lanciati, ma questo non è il caso di Delfi, che potrebbe portare ad eccezioni non gestite.

Ci sono strumenti di analisi del codice che rileva le eccezioni non gestite?

È stato utile?

Soluzione

(Edit:Ora è evidente che la questione di cui solo a design-time di controllo.)

Nuova risposta:

Non posso dire se ci sono strumenti per il controllo di questo per voi.Pascal Analyzer, per uno, non.

Io può dico, però, che nella maggior parte delle applicazioni Delphi, anche se non c'era uno strumento per verificare questo per voi, si dovrebbe ottenere alcun risultato.

Perché? Perché il messaggio principale loop in TApplication.Run() esegue il wrapping di tutti HandleMessage() chiama in un trattamento di eccezioni blocco che cattura tutti i tipi di eccezione.In questo modo si avrà implicita/default la gestione delle eccezioni in giro per il 99,999% di codice nella maggior parte delle applicazioni.E nella maggior parte delle applicazioni, la gestione delle eccezioni sarà di circa il 100% del proprio codice - lo 0,001% di codice che non è avvolto nella gestione delle eccezioni sarà il codice generato automaticamente.

Se ci fosse uno strumento a disposizione per questa verifica, si avrebbe bisogno di riscrivere l'Applicazione.run() in modo che non si include la gestione delle eccezioni.

(Risposta precedente:L'Applicazione.OnException gestore di evento può essere assegnato per la cattura di tutte le eccezioni non gestite da altri gestori di eccezioni.Mentre questo è di run-time, e quindi forse non è esattamente quello che stai dopo (sembra si desidera identificare in fase di progettazione), che non vi permettono di intercettare qualsiasi eccezione non gestita altrove.In combinazione con strumenti come il JCLDebug roba Jedi Code Library, si potrebbe registrare una traccia dello stack per scoprire dove e perché si è verificata un'eccezione, il che permetterebbe ulteriori indagini e l'aggiunta di specifici eccezione trattamento o la prevenzione di tutto il colpevole codice...)

Altri suggerimenti

La mia ipotesi è che si sta cercando di fare Delphi si comportano come Java, che non è un buon approccio.Io vorrei consigliare di non preoccuparsi troppo per le eccezioni non gestite.Nel peggiore dei casi, essi ti bolla generica VCL gestore di eccezioni e causa un messaggio di Windows finestra di dialogo.In una normale applicazione, non arrestare l'applicazione.

Ben scritto codice documento le diverse eccezioni che possono essere sollevate in modo da poterli gestire in modo significativo.Catch-tutti i gestori non sono raccomandati perché non c'è davvero nessun modo per sapere cosa fare se non si sa perché è stata generata un'eccezione.Posso anche altamente consigliabile madExcept.

Tranne che per una scansione sul "rilancio" parola chiave, non c'è nessun costrutto del linguaggio Delphi che dice il lettore casuale che le eccezioni possono essere attesi da un metodo.

In fase di esecuzione, si potrebbe aggiungere un catch-all gestore di eccezioni in ogni metodo, ma non è consigliabile, in quanto rallenta la velocità di esecuzione.(E ingombrante di fare troppo).

Aggiunta di un'eccezione di gestione blocco di un metodo che aggiunge un paio di istruzioni per il montaggio ad esso (anche se l'eccezione non è attivato), che forma misurabile rallentamento quando il metodo viene chiamato molto spesso.

Esistono un paio di librerie che possono aiutare nell'analisi eccezioni runtime, come madExcept, JclDebug, e EurekaLog.Questi strumenti possono accedere tutti i tipi di dettagli circa l'eccezione, è fortemente consigliabile utilizzare uno di quelli!

La risposta è che non c'è strumento che fa quello che dici, e anche una scansione per il sollevare parola chiave non c'è. EAccessViolation o EOutOfMemory sono solo due di una serie di eccezioni che potrebbe avere sollevato appena circa dovunque.

Una cosa fondamentale su Delphi è che le eccezioni sono gerarchici:Tutti definiti lingua eccezioni scendere dal Eccezione, anche se vale la pena di notare che è possibile sollevare qualsiasi TObject discendente.

Se si desidera cattura ogni eccezione che è cresciuto in una particolare procedura, è sufficiente inserirla in una try / except blocco, ma come è stato detto questo non è raccomandato.

// Other code . . . 
try
  SomeProcedure()
except  // BAD IDEA!
  ShowMessage('I caught them all!');
end;

Che cattura tutto, anche le istanze di un rilievo TObject.Anche se direi che questo è raramente il miglior corso di azione.Di solito si desidera utilizzare un try / finally blocco e quindi consentire globale gestore di eccezioni (o una finale try / except blocco) effettivamente gestire le eccezioni.

Io secondo (o terzo) MadExcept.L'ho utilizzato con successo in diverse applicazioni commerciali senza problemi.La cosa bella di MadExcept è quella di generare un report per un full stack trace che, generalmente, un punto nella giusta direzione per ciò che è andato storto, e può anche includere una schermata, come bene ha hanno questo automaticamente inviata dal client computer con un semplice clic del mouse.

Tuttavia, non si desidera utilizzare questo per TUTTE le eccezioni, solo per prendere quelli che ti mancano.Per esempio, se si apre un database e l'accesso non riesce, sarebbe meglio per voi di prendere e gestire questo uno voi stessi piuttosto che dare all'utente la MadExcept di errore di default nell'applicazione si è verificato messaggio.

Ogni eccezione non in modo esplicito o generalmente gestiti in un determinato livello di mantenimento verso l'alto dello stack di chiamate.Delphi RTL (Run Time Library) genererà una serie di diverse classi di eccezione - (matematica errori, errori di accesso, classe errori specifici, ecc).Si può scegliere di gestire in modo specifico o, in generale, nei diversi provare ad eccezione di isolati.

Non avete davvero bisogno di dichiarare una nuova eccezione delle classi meno che non avete bisogno di propagare uno specifico contesto funzionale con l'eccezione.

Come i precedenti commentatori scritto, è anche possibile aggiungere una madre di tutti i gestori di eccezioni come MadExcept o EurekaLog per prendere il uncaught.

edit:Questa è una coperta di assicurazione contro le eccezioni non gestite

try
  ThisFunctionMayFail;
except
  // but it sure won't crash the application
  on e:exception
  do begin
    // something sensible to handle the error 
    // or perhaps log and/or display the the generic e.description message
  end
end;

Per la fase di esecuzione provare Eurekalog.Non so se esiste uno strumento per la progettazione.Si avrà più dificoulties anche quando si dispone di un codice di terze parti senza il codice sorgente.Non c'è bisogno in Delphi per la cattura delle eccezioni, non è necessario dichiarare di loro come in Java.

Quello che volevo dire è che Delphi non è necessario che un'eccezione viene gestita.Si tratterà solo di terminare il programma.EurekaLog fornisce i mezzi per accedere trattati e le eccezioni non gestite e fornire una ricchezza di informazioni sullo stato del programma, quando l'eccezione si è verificato, tra cui la riga di codice che si è verificato e lo stack di chiamate al momento.

Come Jim McKeeth sottolinea, non è possibile ottenere una risposta definitiva, ma mi sembra che si potrebbe parzialmente rispondere alla domanda da alcune analisi statica:data una particolare funzione/procedura, costruire un grafo.Controllare ciascuna delle funzioni che il grafo delle chiamate per un rilancio economico.Che vorresti dire, per esempio, che TIdTcpClient.ReadString può generare un EIdNotConnected (tra gli altri).

Un intelligente analizzatore può inoltre notare che il codice utilizza l'operatore / e includono EDivByZero come una possibilità, o che alcune procedure accede a un array e includono ERangeError.

La risposta è un po ' più stretto di semplicemente un grep per "sollevare".

Finalizzazione sezioni di unità che possono sollevare eccezioni di troppo.Questi slip da me...e sono anche un po ' problematico.

Penso Delphi IDE ha una build-in "stack trace" o "stack albero" qualcosa di simile.

Questa domanda mi ricorda Skybuck del TRussianRoulette gioco...google, il suo codice e la risposta può essere di aiuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top