Ricerca…


eval e muori

Questo è il modo integrato di gestire le "eccezioni" senza fare affidamento su librerie di terze parti come Try :: Tiny .

my $ret;

eval {
  $ret = some_function_that_might_die();
  1;
} or do {
  my $eval_error = $@ || "Zombie error!";
  handle_error($eval_error);
};

# use $ret

Noi "abusiamo" del fatto che il die ha un valore di ritorno falso, e il valore di ritorno del blocco di codice complessivo è il valore dell'ultima espressione nel blocco di codice:

  • se $ret è assegnato correttamente, allora il 1; espressione è l'ultima cosa che accade nel blocco del codice eval . Il blocco del codice eval ha quindi un valore vero, quindi il blocco or do non viene eseguito.
  • se some_function_that_might_die() die , l'ultima cosa che accade nel blocco del codice eval è il die . Il blocco del codice eval ha quindi un valore falso e il blocco or do viene eseguito.
  • La prima cosa che devi fare nel blocco or do è leggere $@ . Questa variabile globale terrà qualunque argomento sia passato per die . || "Zombie Error" guardia || "Zombie Error" è popolare, ma non necessaria nel caso generale.

Questo è importante per capire perché alcuni non tutti i codici falliscono chiamando die, ma la stessa struttura può essere usata a prescindere. Si consideri una funzione del database che restituisce:

  • il numero di righe interessate al successo
  • '0 but true' se la query ha esito positivo, ma nessuna riga è stata interessata
  • 0 se la query non ha avuto successo.

In questo caso è comunque possibile utilizzare lo stesso linguaggio, ma si deve saltare la finale 1; e questa funzione deve essere l'ultima cosa nella valutazione. Qualcosa come questo:

eval {
  my $value = My::Database::retrieve($my_thing); # dies on fail
  $value->set_status("Completed");
  $value->set_completed_timestamp(time());
  $value->update(); # returns false value on fail
} or do { # handles both the die and the 0 return value
  my $eval_error = $@ || "Zombie error!";
  handle_error($eval_error);
};


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow