Поведение метода __exit__
Что должен возвращать метод __exit__? В документации сказано, что если я возвращаю true, то исключение будет обработано. Если я ничего не возвращаю, то исключение пропускается. А что если я возвращаю false или что-то ещё? Как тогда? Как это реализовано? Поясните.
Ответы (1 шт):
Перевод абзаца про возвращаемое значение:
Если предоставлено исключение, и метод хочет подавить исключение (т. е. предотвратить его распространение), он должен вернуть истинное значение. В противном случае исключение будет обработано нормально при выходе из этого метода.
Т.е. __exit__ должен вернуть True, если в блоке with исключения были обработаны самой функцией __exit__. Если же в блоке with возникло исключение, которое вы не обрабатываете в функции __exit__, или же не было исключений вовсе, то эта самая функция должна возвращать False.
Обращаю внимание на то, что в __exit__ нужно обрабатывать исключение не через блок try-except, а исходя из предоставленного исключения.
Если в блоке with возникает исключение, вызывается функция __exit__, и в качестве параметров передаются exc_type, exc_value, traceback, т.е. внутри функции вы точно знаете тип вызванного исключения, значение (комментарий) исключения, и у вас есть трейсбек.
Если в блоке with исключений не возникает, функция __exit__ вызывается с None-параметрами в конце блока with.