Différences dans la relation entre PHP et Python enfin et quitter

Résumé

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`.

PHP: exit - Manual

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'instructiontry, 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é.

Articles Liés

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

Différences dans la relation entre PHP et Python enfin et quitter
Différence entre Ruby et Python Split
Différence entre java et python (mémo)
Différence entre list () et [] en Python
Différence entre la série python2 et la série python3 dict.keys ()
[Python] Différence entre fonction et méthode
Python - Différence entre exec et eval
[Python] Différence entre randrange () et randint ()
[Python] Différence entre trié et trié (Colaboratoire)
différence entre les instructions (instructions) et les expressions (expressions) en Python
Différence entre @classmethod et @staticmethod en Python
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
[Python] Différence entre la méthode de classe et la méthode statique
[Python Iroha] Différence entre List et Tuple
[python] Différence entre la sortie rand et randn
Résumé des différences entre PHP et Python
[python] Différence entre variable et self. Variable dans la classe
À propos de la différence entre "==" et "is" en python
Différence entre processus et travail
Différence entre "categorical_crossentropy" et "sparse_categorical_crossentropy"
Différence entre Ruby et Python en termes de variables
Différence entre régression et classification
Différence entre return, return None et no return description en Python
Différence entre np.array et np.arange
Différence entre MicroPython et CPython
Différence entre ps a et ps -a
Différence entre return et print-Python
Module Python num2words Différence de comportement entre l'anglais et le russe
Python> Différence entre la sortie inpbt et print (inpbt)> [1. 2. 3.] / array ([1., 2., 3.], dtype = float32)
Méthode de concaténation de liste en python, différence entre list.extend () et opérateur «+»
Différence entre SQLAlchemy filter () et filter_by ()
Mémorandum (différence entre csv.reader et csv.dictreader)
(Remarque) Différence entre la passerelle et la passerelle par défaut
Coopération entre le module python et l'API
Différence entre le randint de Numpy et le randint de Random
Différence entre Python, stftime et strptime
Différence entre tri et tri (mémorial)
Différence entre SQLAlchemy flush () et commit ()
Python / Numpy> Lien> Différence entre numpy.random et random.random> thread-safe ou non
Résumé des différences entre Python et PHP (tableau de comparaison des principaux éléments)
Fonction pour ouvrir un fichier en Python3 (différence entre open et codecs.open et comparaison de vitesse)
Communiquez entre Elixir et Python avec gRPC
Différence d'authenticité entre Python et JavaScript
Évitez les boucles imbriquées en PHP et Python
Différences entre Ruby et Python dans la portée
[Xg boost] Différence entre softmax et softprob
[Django ORM] Différence entre values () et only ()
Différence entre la régression linéaire, la régression Ridge et la régression Lasso
[Grammaire de base] Différences entre Ruby / Python / PHP
Différence entre le fichier env_file docker-compose et le fichier .env
[Python3] Basculer entre Shift_JIS, UTF-8 et ASCII
Différence de vitesse entre wsgi, bouteille et flacon
Différences de multithreading entre Python et Jython
Différence entre Ruby et Python (syntaxe de base)
Différence entre numpy.ndarray et list (dimension, taille)
Correspondance entre les fonctions intégrées de Python et Rust
Différence entre ls -l et la commande cat
Communication de données chiffrées entre Python et C #