Sys.exit ()
et ʻexitde Python lancent une exception intégrée
SystemExit`.
Par conséquent, il se comporte comme une partie de «try-catch» et entre également «enfin».SystemExit
hérite de BaseException
pour ne pas être intercepté par erreur par catch
comme une exception ou une erreur normale. (Vous pouvez également «attraper» consciemment.)
En d'autres termes, on peut considérer que le processus d'arrêt est effectué à l'endroit où le niveau supérieur «SystemExit» est reçu.La différence est de savoir s'il faut ou non gérer ʻexit` comme une exception.
PHP
Vous pouvez le trouver dans l'explication et les notes utilisateur de ʻexit`.
Exemple 3 Un exemple d'une fonction d'arrêt ou d'un destructeur en cours d'exécution
>
<?php
class Foo
{
public function __destruct()
{
echo 'Destruct: ' . __METHOD__ . '()' . PHP_EOL;
}
}
>
function shutdown()
{
echo 'Shutdown: ' . __FUNCTION__ . '()' . PHP_EOL;
}
>
$foo = new Foo();
register_shutdown_function('shutdown');
>
exit();
echo 'Ce n'est pas une sortie.';
?>
La sortie de l'exemple ci-dessus est la suivante.
Shutdown: shutdown()
Destruct: Foo::__destruct()
PHP: exit - Manual : User Contributed Notes
A side-note for the use of exit with finally: if you exit somewhere in a try block, the finally won't be executed. Could not sound obvious: for instance in Java you never issue an exit, at least a return in your controller; in PHP instead you could find yourself exiting from a controller method (e.g. in case you issue a redirect).
Here follows the POC:
<?php
echo "testing finally wit exit\n";
>
try {
echo "In try, exiting\n";
>
exit;
} catch(Exception $e) {
echo "catched\n";
} finally {
echo "in finally\n";
}
>
echo "In the end\n";
?>
This will print:
testing finally wit exit In try, exiting
Il existe également un moyen de lancer une exception au lieu de exit et d'écrire le processus de terminaison avec catch, mais il semble que ce ne soit pas une alternative parfaite.
Naturellement, j'ai essayé de l'exécuter sur PHP7, mais le résultat était le même.
Python
Note Uchan: Différences entre Python exit (), sys.exit (), os._exit () C'est un coup d'œil si vous le regardez.
ʻOs._exit () est une exception lancée, donc
finallyest également pertinent. Quand on dit que ʻos._exit ()
est équivalent à ʻexit ()` de PHP, cela semble un peu différent.
exit
4. Constantes intégrées - Documentation Python 2.7.x
Un objet qui imprime un message comme «Utilisez quit () ou Ctrl-D (ie EOF) pour quitter» lorsqu'il est affiché et envoie une «Sortie système» avec le code de sortie spécifié lorsqu'il est appelé. ..
sys.exit()
[28.1. Sys - Paramètres et fonctions système - Documentation Python 2.7.x]
Quittez
Python
. Puisque ʻexit ()envoie un
SystemExit, il est possible de décrire le processus de terminaison dans la clause
finallyde l'instruction
try, ou d'attraper une exception à un niveau supérieur et d'interrompre le processus ʻexit
. Je peux le faire. (Omis) En fin de compte, ʻexit () `ne lance« que »une exception, donc quand il est appelé depuis le thread principal, il termine simplement le processus et ne bloque pas l'exception.
6. Exceptions intégrées - Documentation Python 2.7.x
Cette exception est levée par la fonction sys.exit (). Si cette exception n'est pas gérée, l'interpréteur Python se fermera sans afficher de trace de pile. Si la valeur associée est un entier normal, elle représente l'état de sortie du système (passé à la fonction exit ()). Si la valeur est None, l'état de sortie est 0. Pour les autres types (tels que les chaînes), la valeur de cet objet est affichée et l'état de sortie est 1.
L'instance de cette exception a le code d'attribut. Cette valeur est définie sur l'état de sortie ou le message d'erreur (Aucun par défaut). De plus, cette exception n'est pas strictement une erreur, elle dérive donc de BaseException au lieu de StandardError.
sys.exit () garantit que le processus de nettoyage (clause finally de l'instruction try) est exécuté et que le script peut être exécuté sans risquer de perdre le contrôle du débogueur. Traduit en exceptions. Vous pouvez utiliser la fonction os._exit () lorsqu'il y a un réel besoin fort de se terminer immédiatement (par exemple, dans un processus enfant après avoir appelé fork ()).
Cette exception hérite de BaseException plutôt que de StandardError ou Exception afin que le code qui intercepte l'exception ne la rattrape pas accidentellement. Cela propagera régulièrement cette exception à l'appelant et mettra fin à l'interpréteur.
Modifié dans la version 2.5: modifié pour hériter de BaseException.
Exactement! n'est-ce pas.
os._exit()
15.1. Os - Diverses interfaces du système d'exploitation - Documentation Python 2.7.x
Terminez le processus avec le statut de fin n. À ce stade, le gestionnaire de nettoyage n'est pas appelé et le tampon d'entrée / sortie standard n'est pas vidé.
Du même blog.
C'est une transition de l'ère sans «enfin» à l'ère après la mise en œuvre, Combiné avec l'opération de ʻexit` cette fois, je sens que le destructeur a été re-reconnu.
Recommended Posts