Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ

БобСсСдованиС ΠΏΠΎ Java β€” ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (exceptions) (вопросы ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹)

Бписок вопросов ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ Β«Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² JavaΒ».

К списку вопросов ΠΏΠΎ всСм Ρ‚Π΅ΠΌΠ°ΠΌ

Вопросы

1. Π”Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ β€œΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅β€
2. Какова иСрархия ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.
3. МоТно/Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки jvm?
4. КакиС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ способы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ?
5. О Ρ‡Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово throws?
6. Π’ Ρ‡Π΅ΠΌ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π±Π»ΠΎΠΊΠ° finally? ВсСгда Π»ΠΈ ΠΎΠ½ исполняСтся?
7. ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ Π½Π΅ Π±Ρ‹Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° catch ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ?
8. Могли Π±Ρ‹ Π²Ρ‹ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Ρ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π±Π»ΠΎΠΊ finally Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½?
9. ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ catch ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ нСсколько ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (с ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ€Π°Π·Π½Ρ‹Ρ… Π²Π΅Ρ‚ΠΎΠΊ наслСдований)?
10. Π§Ρ‚ΠΎ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎΠ± ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… ΠΈ Π½Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… (checked/unchecked) ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ…?
11. Π’ Ρ‡Π΅ΠΌ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ RuntimeException?
12. Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ собствСнноС (β€œΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅β€) ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅? Какими ΠΌΠΎΡ‚ΠΈΠ²Π°ΠΌΠΈ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Ρ€ΡƒΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Ρ‚ΠΈΠΏΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ: checked/unchecked?
13. Какой ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ позволяСт ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅?
14. Π•ΡΡ‚ΡŒ Π»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ условия ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅?
15. ΠœΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ main Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΎ Π²Π½Π΅ ΠΈ Ссли Π΄Π°, Ρ‚ΠΎ Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ?
16. Если ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ return содСрТится ΠΈ Π² Π±Π»ΠΎΠΊΠ΅ catch ΠΈ Π² finally, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… β€œΠ³Π»Π°Π²Π½Π΅Π΅β€?
17. Π§Ρ‚ΠΎ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ OutOfMemoryError?
18. Π§Ρ‚ΠΎ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ΠΎ SQLException? К ΠΊΠ°ΠΊΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ checked ΠΈΠ»ΠΈ unchecked ΠΎΠ½ΠΎ относится, ΠΏΠΎΡ‡Π΅ΠΌΡƒ?
19. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Error? Π’ ΠΊΠ°ΠΊΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Error. ΠŸΡ€ΠΈΠ²Π΅Π΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Error’а.
20. Какая конструкция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² Java для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ?
21. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π΅ΡΡ‚ΡŒ Π±Π»ΠΎΠΊ try-finally. Π’ Π±Π»ΠΎΠΊΠ΅ try Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΠ»ΠΎΡΡŒ Π² Π±Π»ΠΎΠΊ finally. Π’ Π±Π»ΠΎΠΊΠ΅ finally Ρ‚ΠΎΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. КакоС ΠΈΠ· Π΄Π²ΡƒΡ… ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ β€œΠ²Ρ‹ΠΏΠ°Π΄Π΅Ρ‚β€ ΠΈΠ· Π±Π»ΠΎΠΊΠ° try-finally? Π§Ρ‚ΠΎ случится со Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ?
22. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ IOException ΠΈ FileNotFoundException Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ΄Ρ‚ΠΈ Π±Π»ΠΎΠΊΠΈ catch? Бколько Π±Π»ΠΎΠΊΠΎΠ² catch Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ?

ΠžΡ‚Π²Π΅Ρ‚Ρ‹

1. Π”Π°ΠΉΡ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ β€œΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅β€

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ β€” это ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°(ошибка) Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰Π°Ρ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Ρ‚ΡŒ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ВсС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Java ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ автоматичСски ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации, Π½ΠΎ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ самим Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ.

2. Какова иСрархия ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ дСлятся Π½Π° нСсколько классов, Π½ΠΎ всС ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ° β€” класс Throwable. Π•Π³ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ подклассы Exception ΠΈ Error.

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (Exceptions) ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Ρ€Π΅ΡˆΠ°Π΅ΠΌΡ‹ ΠΈ прСдсказуСмы. НапримСр, ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ноль Π² Ρ†Π΅Π»Ρ‹Ρ… числах.

Ошибки (Errors) ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅, согласно спСцификации Java, Π½Π΅ слСдуСт ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π² собствСнной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ связаны с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ уровня JVM. НапримСр, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚, Ссли Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, доступная Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машинС. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ всё Ρ€Π°Π²Π½ΠΎ Π½Π΅ смоТСт ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ для JVM.

Π’ Java всС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ дСлятся Π½Π° Π΄Π²Π° Ρ‚ΠΈΠΏΠ°: ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (checked) ΠΈ Π½Π΅ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ (unchecked), ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ относятся ошибки (Errors) ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния (RuntimeExceptions, ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ класса Exception).

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой ошибки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊ этому Ρ‚ΠΈΠΏΡƒ относятся всС ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ класса Exception (Π½ΠΎ Π½Π΅ RuntimeException).

3. МоТно/Π½ΡƒΠΆΠ½ΠΎ Π»ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки jvm?

ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ этого Π½Π΅ стоит. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ Π½Π΅ прСдоставлСны инструмСнты для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок систСмы ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹.

4. КакиС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ способы ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ?

ΠžΠ±Ρ‰ΠΈΠΉ Π²ΠΈΠ΄ конструкции для Β«ΠΏΠΎΠΈΠΌΠΊΠΈΒ» ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ситуации выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ использованиС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Java

Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ суток, ΡƒΠ²Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ Π₯Π°Π±Ρ€.
Π― Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Java. Частично этот ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» рассматриваСтся Π½Π° просторах ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ рассматриваСтся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π² ΠΊΠ½ΠΈΠ³Π΅ J.Bloch Effective Java. Π Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚ ΠΎ использовании ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… (checked/unchecked) ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΡ…. Π‘Ρ‚Π°Ρ‚ΡŒΡ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½Π° Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌ, Ρ‚.ΠΊ. Π²Π½Π°Ρ‡Π°Π»Π΅ Π½Π΅ всСгда ясно, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ.

Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Java прСдставлСна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ класс для всСх Throwable. ΠžΡ‚ Π½Π΅Π³ΠΎ унаслСдовано 2 класса: Exception ΠΈ Error. ΠžΡ‚ класса Exception унаслСдован Π΅Ρ‰Π΅ RuntimeException.
Error – критичСскиС ошибки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π² систСмС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, StackOverflowError ). Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ… систСма. Если ΠΎΠ½ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚, Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ закрываСтся, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ Π΄Π°Π½Π½ΠΎΠΉ ситуации Ρ€Π°Π±ΠΎΡ‚Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½Π°.

Exception – это ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Ссли ΠΌΠ΅Ρ‚ΠΎΠ΄ бросаСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ унаслСдовано ΠΎΡ‚ Exception (Π½Π°ΠΏΡ€. IOException), Ρ‚ΠΎ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ Π² Π±Π»ΠΎΠΊ try-catch. Π‘Π°ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ бросаСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π² сигнатурС ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ throws. ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ (checked) ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈ, соотвСтствСнно, ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π° прилоТСния Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ β€” это ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ сущСствуСт (IOException). Π’ Π΄Π°Π½Π½ΠΎΠΌΡƒ случаС, Ρ€Π°Π±ΠΎΡ‚Π° прилоТСния Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½Π° ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Ρ„Π°ΠΉΠ» Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан.
НапримСр:

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ createTempFile ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ IOException, ΠΊΠΎΠ³Π΄Π° Ρ„Π°ΠΉΠ» Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан. И это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ соотвСтствСнно. Если ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π½Π΅ Π±Π»ΠΎΠΊΠ° try-catch, Ρ‚ΠΎ компилятор выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ 2 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° исправлСния: ΠΎΠΊΡ€ΡƒΠΆΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±Π»ΠΎΠΊΠΎΠΌ try-catch ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ вызываСтся File.createTempFile, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ IOException (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π²Π΅Ρ€Ρ…Π½ΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ).

RuntimeException – это Π½Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Они Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π²ΠΎ врСмя выполнСния прилоТСния. К Ρ‚Π°ΠΊΠΈΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌ относится, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, NullPointerException. Они Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Π±Π»ΠΎΠΊ try-catch. Когда RuntimeException Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, это ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ ошибкС, Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΉ программистом (Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²Ρ‹Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ массива ΠΈ Ρ‚.Π΄.). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ, Π° Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² ΠΊΠΎΠ΄Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ вновь Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ.
НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с RuntimeException:

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Rectangle. Π’ описании ΠΌΠ΅Ρ‚ΠΎΠ΄Π° содСрТится строка @throws, которая описываСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΊΠΈΡ… условиях. Однако, сигнатура ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π΅ содСрТит конструкции throws. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΎΠΌ try-catch. А программист Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π΅ Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ Π½Π΅ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

НадСюсь, Ρ‚Π°ΠΊΠΈΠ΅ нСбольшиС Ρ€Π°Π·ΡŠΡΡΠ½Π΅Π½ΠΈΡ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π° ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ просто ΠΈΡΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ошибки Π² ΠΊΠΎΠ΄Π΅.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π‘++ exception handling ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² C++

Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ„ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ. Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° ΠΏΡ€ΠΎ Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ. Π€ΠΎΡ‚ΠΎ Π§Ρ‚ΠΎ случится с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ exception послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ

ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°

На Ρ…Π°Π±Ρ€Π΅ Π΅ΡΡ‚ΡŒ нСсколько статСй, ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… ΠΈ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ (ΠΏΡ€ΠΈ этом всС Ρ€Π°Π²Π½ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ…), посвящСнных Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ exceptions Π² C++. Однако Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎ-настоящСму Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠΉ, поэтому я Ρ€Π΅ΡˆΠΈΠ» Π²ΠΎΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ этот ΠΏΡ€ΠΎΠ±Π΅Π», Π±Π»Π°Π³ΠΎ Π΅ΡΡ‚ΡŒ подходящий ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π». ΠšΠΎΠΌΡƒ интСрСсно ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² C++ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ gcc β€” Π·Π°ΠΏΠ°ΡΠΈΡ‚Π΅ΡΡŒ pocket-ΠΎΠΌ ΠΈΠ»ΠΈ evernote, свободным Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

2 Ρ‡Π°ΡΡ‚ΡŒ
3 Ρ‡Π°ΡΡ‚ΡŒ

P.S. ΠŸΠ°Ρ€Ρƒ слов ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π΅:

C++ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ

Для Π½Π°Ρ‡Π°Π»Π° Π½ΡƒΠΆΠ½ΠΎ ΡΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ сСбя: ΠΊΠ°ΠΊ это всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? Π­Ρ‚ΠΎ пСрвая ΡΡ‚Π°Ρ‚ΡŒΡ ΠΈΠ· Π΄Π»ΠΈΠ½Π½ΠΎΠΉ сСрии, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я ΠΏΠΈΡˆΡƒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ Π² C++ (ΠΏΠΎΠ΄ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ gcc ΠΏΠΎΠ΄ x86, Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌ Ρ‚Π°ΠΊ ΠΆΠ΅). Π’ этих ΡΡ‚Π°Ρ‚ΡŒΡΡ… процСс выброса ΠΈ ΠΎΡ‚Π»ΠΎΠ²Π° ошибок Π±ΡƒΠ΄Π΅Ρ‚ объяснСн Π²ΠΎ всСх подробностях, Π½ΠΎ для Π½Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π»ΠΈΠ²Ρ‹Ρ…: ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠΉ Π±Ρ€ΠΈΡ„ всСх статСй ΠΎ пробросС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² gcc/x86:

Π”Π°ΠΆΠ΅ сСйчас это выглядит слоТно, Π° вСдь ΠΌΡ‹ Π΄Π°ΠΆΠ΅ Π½Π΅ Π½Π°Ρ‡Π°Π»ΠΈ, это Π±Ρ‹Π»ΠΎ лишь ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ ΠΈ Π½Π΅Ρ‚ΠΎΡ‡Π½ΠΎΠ΅ описаниС слоТностСй, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ.

Если Π²Ρ‹ слишком Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½Ρ‹, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ Ρ‚ΡƒΡ‚. Π­Ρ‚ΠΎ β€” полная спСцификация Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… частях. Π― ΠΆΠ΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ ΠΏΠΎΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈ Π±ΠΎΠ»Π΅Π΅ простой, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π· Π²Π°ΠΌ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ с вашим собствСнным ABI (application binary interface, Π”Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ интСрфСйс ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ β€” ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°).

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ (ΠΎΡ‚ΠΊΠ°Π· ΠΎΡ‚ отвСтствСнности):
Π― Π½ΠΈ Π² ΠΊΠΎΠ΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π½Π΅ ΡΠ²Π΅Π΄ΡƒΡŽ Π² Ρ‚ΠΎΠΌ, какая Π²ΡƒΠ΄Ρƒ-магия происходит, ΠΊΠΎΠ³Π΄Π° пробрасываСтся ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΠΎΠΏΡ‹Ρ‚Π°ΡŽΡΡŒ Ρ€Π°Π·ΠΎΠ±Π»Π°Ρ‡ΠΈΡ‚ΡŒ Ρ‚Π°ΠΉΠ½ΠΎΠ΅ ΠΈ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΆΠ΅ ΠΎΠ½ΠΎ устроСно. КакиС-Ρ‚ΠΎ ΠΌΠ΅Π»ΠΎΡ‡ΠΈ ΠΈ тонкости Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π΄Π°ΠΉΡ‚Π΅ ΠΌΠ½Π΅ Π·Π½Π°Ρ‚ΡŒ, Ссли Π³Π΄Π΅-Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

ΠŸΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°: это Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΈ для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°.

C++ exceptions ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ: малСнький ABI

Если ΠΌΡ‹ попытаСмся ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‚Π°ΠΊΠΈΠ΅ слоТныС ΠΈ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈΠ±ΠΎ ΡƒΡ‚ΠΎΠ½ΡƒΡ‚ΡŒ Π² Ρ‚ΠΎΠ½Π½Π°Ρ… ΠΌΠ°Π½ΡƒΠ°Π»ΠΎΠ² ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΉ, Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π»ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, я Π±Ρ‹Π» ΡƒΠ΄ΠΈΠ²Π»Π΅Π½ отстутствиСм качСствСнной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ (ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ° β€” я, ΠΊ слову, Ρ‚ΠΎΠΆΠ΅): всС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π»ΠΈΠ±ΠΎ чСрСсчур Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ, Π»ΠΈΠ±ΠΎ слишком ΡƒΠΆ простоС. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π΅ΡΡ‚ΡŒ спСцификации (Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ: ABI for C++, Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ CFI, DWARF ΠΈ libstdc), Π½ΠΎ обособлСнного Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ нСдостаточно, Ссли Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит Π²Π½ΡƒΡ‚Ρ€ΠΈ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ с ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΠ³ΠΎ: с пСрСизобрСтСния колСса! ΠœΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² чистом C Π½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ попытаСмся ΡΠ»ΠΈΠ½ΠΊΠΎΠ²Π°Ρ‚ΡŒ C++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π»ΠΈΠ½ΠΊΠ΅Ρ€ΠΎΠΌ чистого C ΠΈ посмотрим, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚! Π― Π½Π°Ρ‡Π°Π» с Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ простого Ρ‚ΠΈΠΏΠ° этого:

И ΠΎΡ‡Π΅Π½ΡŒ простой main:

Π§Ρ‚ΠΎ случится, Ссли ΠΌΡ‹ попытаСмся ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΡΠ»ΠΈΠ½ΠΊΠΎΠ²Π°Ρ‚ΡŒ этот Ρ„Ρ€Π°Π½ΠΊΠΈΠ½ΠΊΠΎΠ΄?

Π—Π°ΠΌΠ΅Ρ‚ΠΊΠ°: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ вСсь исходный ΠΊΠΎΠ΄ для этого ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с ΠΌΠΎΠ΅Π³ΠΎ Π³ΠΈΡ‚-рСпозитория.

Пока Ρ‡Ρ‚ΠΎ всС Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Оба, g++ ΠΈ gcc, счастливы Π² своСм малСньком ΠΌΠΈΡ€Π΅. Π₯аос начнСтся сразу, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΡ‹ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΈΡ… ΡΠ»ΠΈΠ½ΠΊΠΎΠ²Π°Ρ‚ΡŒ вмСстС:

C++ exceptions ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ: ΡƒΠ³ΠΎΠΆΠ΄Π°Π΅ΠΌ Π»ΠΈΠ½ΠΊΠ΅Ρ€Ρƒ, ΠΏΠΎΠ΄ΠΏΠΈΡ…Π½ΡƒΠ² Π΅ΠΌΡƒ ABI

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой собствСнный mini-ABI, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ пробрасывания ошибок. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, Π½Π°ΠΌ понадобится лишь RTFM, ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΠΎΠ»Π½Ρ‹ΠΉ интСрфСйс ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½ Ρ‚ΡƒΡ‚, для LLVM. Вспомним-ΠΊΠ°, ΠΊΠ°ΠΊΠΈΡ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ нСдостаСт:

__cxa_allocate_exception

Имя самодостаточно, я полагаю. __cxa_allocate_exception ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ size_t ΠΈ выдСляСт достаточноС количСство памяти для хранСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²ΠΎ врСмя Π΅Π³ΠΎ пробрасывания. Π­Ρ‚ΠΎ слоТнСС, Ρ‡Π΅ΠΌ каТСтся: ΠΊΠΎΠ³Π΄Π° ошибка обрабатываСтся, происходит нСкая магия со стСком, Π°Π»Π»ΠΎΡ†ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ° β€” Π΄Π° проститС Π·Π° это слово, Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° я Π±ΡƒΠ΄Ρƒ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ) Π² стСкС β€” плохая идСя. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² ΠΊΡƒΡ‡Π΅ (heap), Π² ΠΎΠ±Ρ‰Π΅ΠΌ, Ρ‚ΠΎΠΆΠ΅ плохая идСя, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π³Π΄Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ, ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ°ΠΌΡΡ‚ΡŒ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ? Π‘Ρ‚Π°Ρ‚ΠΈΡ‡Π½ΠΎΠ΅ (static) Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² памяти Ρ‚Π°ΠΊ ΠΆΠ΅ плохая идСя, ΠΏΠΎΠΊΡƒΠ΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это потокобСзопасным (ΠΈΠ½Π°Ρ‡Π΅ Π΄Π²Π° ΠΊΠΎΠ½ΠΊΡƒΡ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π²Ρ‹Π±Ρ€ΠΎΡΠΈΠ²ΡˆΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΏΡ€ΠΈΠ²Π΅Π΄ΡƒΡ‚ ΠΊ катастрофС). Учитывая эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Ρ‹Π³ΠΎΠ΄Π½Ρ‹ΠΌ выглядит Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти Π² локальном Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° (ΠΊΡƒΡ‡Π΅), ΠΎΠ΄Π½Π°ΠΊΠΎ ΠΏΡ€ΠΈ нСобходимости ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠΌΡƒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Ρƒ (ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, статичному), Ссли ΠΏΠ°ΠΌΡΡ‚ΡŒ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ (out of memory). ΠœΡ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅, Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π²ΠΎΠ»Π½ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ ΡΡ‚Ρ€Π°ΡˆΠ½Ρ‹Ρ… Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ просто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ статичный Π±ΡƒΡ„Π΅Ρ€, Ссли понадобится.

__cxa_throw

vtable для __cxxabiv1::__class_type_info

Бтранно… __class_type_info явно какая-Ρ‚ΠΎ RTTI (run-time type information, run-time type identification, ДинамичСская идСнтификация Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…), Π½ΠΎ какая ΠΈΠΌΠ΅Π½Π½ΠΎ? Пока Π½Π°ΠΌ Π½Π΅ просто ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° это, Π΄Π° ΠΈ это Π½Π΅ адски Π²Π°ΠΆΠ½ΠΎ для нашСго ΠΌΠΈΠ½ΠΈ-ABI; оставим это части «ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅», ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π° процСсса пробрасывания ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, сСйчас ΠΆΠ΅ Π΄Π°Π²Π°ΠΉΡ‚Π΅ просто скаТСм, Ρ‡Ρ‚ΠΎ это β€” Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° опрСдСлСния ABI Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π°Ρ Π½Π° вопрос: «ΡΡ‚ΠΈ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ ΠΈΠ»ΠΈ Π½Π΅Ρ‚». Π­Ρ‚ΠΎ функция, которая вызываСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ: ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ Π΄Π°Π½Π½Ρ‹ΠΉ catch-Π±Π»ΠΎΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈΠ»ΠΈ Π½Π΅Ρ‚. БСйчас ΠΌΡ‹ сфокусируСмся Π½Π° основном: Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π°Ρ‚ΡŒ Π΅Ρ‘ ΠΊΠ°ΠΊ адрСс для Π»ΠΈΠ½ΠΊΠ΅Ρ€Π° (Ρ‚.Π΅. ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Ρ‘ Π½Π΅ достаточно, Π½ΡƒΠΆΠ½ΠΎ Π΅Ρ‰Π΅ Π΅Ρ‘ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ) ΠΈ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ vtable (Π΄Π° Π΄Π°, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄).

Много Ρ€Π°Π±ΠΎΡ‚Ρ‹ происходит Π² этих функциях, Π½ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΌΠ΅Ρ‚Π°Ρ‚Π΅Π»ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ: Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (call exit), ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½ΠΎ. НашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‡Ρ‚ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ, Π½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ABI-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ создадим mycppabi.cpp. Читая Π½Π°ΡˆΡƒ ABI-ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ наши сигнатуры для __cxa_allocate_exception ΠΈ __cxa_throw:

Напомню: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ исходники Π² ΠΌΠΎΠ΅ΠΌ github Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Π”Π°ΠΆΠ΅ большС ΠΌΠ°Π³ΠΈΠΈ: ΠΊΠΎΠ³Π΄Π° throw транслируСтся Π² эти Π΄Π²Π° Π²Ρ‹Π·ΠΎΠ²Π°, компилятор Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ libstdc++ опрСдСляСт __cxa_throw ΠΈ Π΅Ρ‘ Π΄Ρ€ΡƒΠ·Π΅ΠΉ, libstdc++ динамичСски линкуСтся Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅, ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΌ запускС прилоТСния.

ΠœΡ‹ ΡƒΠΆΠ΅ Π²ΠΈΠ΄ΠΈΠΌ прогрСсс, Π½ΠΎ Π½Π°ΠΌ Π΅Ρ‰Π΅ стоит ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ познания. БСйчас наш ABI ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. МоТСм Π»ΠΈ ΠΌΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π» ошибки? Π§Ρ‚ΠΎ ΠΆ, посмотрим, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅!

C++ exceptions ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ: ΠΎΡ‚Π»ΠΎΠ² Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ бросаСм

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ завСсу Ρ‚Π°ΠΉΠ½Ρ‹ ΠΎ пробросС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, наблюдая Π·Π° ошибками компилятора ΠΈ Π»ΠΈΠ½ΠΊΠ΅Ρ€Π°, Π½ΠΎ ΠΌΡ‹ Π΄ΠΎ сих ΠΏΠΎΡ€ Π΄Π°Π»Π΅ΠΊΠΈ Π΄ΠΎ понимания Ρ‡Π΅Π³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΎΠ± ΠΎΡ‚Π»ΠΎΠ²Π΅ ошибок. Π Π΅Π·ΡŽΠΌΠΈΡ€ΡƒΠ΅ΠΌ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ выяснили:

Как ΠΈ Ρ€Π°Π½Π΅Π΅, ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ seppuku, ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡŽΡ‰ΡƒΡŽ C ΠΈ C++ ΠΌΠΈΡ€Ρ‹, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² этот Ρ€Π°Π· ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ нСсколько Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ наш стэк Π±ΠΎΠ»Π΅Π΅ интСрСсным, Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π²Π΅Ρ‚Π²ΠΈ try/catch Π±Π»ΠΎΠΊΠΎΠ², Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ libstdc++ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡ….

И вновь ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ошибки Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ° ΠΎΠ± ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ABI-функциях:

ΠœΡ‹ ΠΎΠΏΡΡ‚ΡŒ Π²ΠΈΠ΄ΠΈΠΌ ΠΊΡƒΡ‡Ρƒ всСго интСрСсного. Π’Ρ‹Π·ΠΎΠ² __cxa_begin_catch ΠΈ __cxa_end_catch ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π»ΠΈ, Ρ…ΠΎΡ‚ΡŒ ΠΏΠΎΠΊΠ° ΠΈ Π½Π΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΎΠ΅, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ эквивалСнтны throw/__cxa_allocate/throw. __gxx_personality_v0 β€” Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅, ΠΈ ΠΎΠ½ΠΎ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ основной Ρ‚Π΅ΠΌΠΎΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… частСй.

Π§Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ функция? (ΠΏΡ€ΠΈ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ° β€” Π½Π΅ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π» Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ названия, подскаТитС Π² коммСнтариях, Ссли Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ). ΠœΡ‹ ΡƒΠΆΠ΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ ΠΎ Π½Π΅ΠΉ Π²ΠΎ Π²Π²Π΅Π΄Π΅Π½ΠΈΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π· ΠΌΡ‹ посмотрим Π½Π° Π½Π΅Π΅ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½Π΅Π΅, ΠΊΠ°ΠΊ ΠΈ Π½Π° Π½Π°ΡˆΠΈΡ… Π΄Π²ΡƒΡ… Π½ΠΎΠ²Ρ‹Ρ… Π΄Ρ€ΡƒΠ·Π΅ΠΉ: __cxa_begin_catch ΠΈ __cxa_end_catch.

C++ exceptions ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ: магия Π²ΠΎΠΊΡ€ΡƒΠ³ __cxa_begin_catch ΠΈ __cxa_end_catch

ПослС изучСния Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°ΡŽΡ‚ΡΡ, ΠΌΡ‹ оказались Π½Π° ΠΏΡƒΡ‚ΠΈ изучСния, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ. Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния try-catch-Π±Π»ΠΎΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ компилятор, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ошибки Π»ΠΈΠ½ΠΊΠ΅Ρ€Π° прямо ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΎΡˆΠ»Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ смотрСли, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ throw-Π±Π»ΠΎΠΊ. Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ Π»ΠΈΠ½ΠΊΠ΅Ρ€:

Напомню, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π° ΠΌΠΎΠ΅ΠΌ Π³ΠΈΡ‚-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Π’ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ (Π² нашСй Ρ‚Π΅ΠΎΡ€ΠΈΠΈ, разумССтся), catch-Π±Π»ΠΎΠΊ транслируСтся Π² ΠΏΠ°Ρ€Ρƒ __cxa_begin_catch/end_catch ΠΈΠ· libstdc++, Π½ΠΎ ΠΈ Π²ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΏΠΎΠΊΠ° Π΅Ρ‰Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π½Π°Π΅ΠΌ.

ВсС ΠΈΠ΄Π΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ: ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для raise(), лишь выброс ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ:

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для try_but_dont_catch() ΠΎΠ±Ρ€Π΅Π·Π°Π½ΠΎ компилятором. Π­Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½ΠΎΠ²ΠΎΠ΅: ссылка Π½Π° __gxx_personality_v0 ΠΈ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ LSDA. Π­Ρ‚ΠΎ выглядит Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ это ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ:

Π›ΠΈΡˆΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ функции… с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ мусором CFI Π² Π½Π΅ΠΌ.

Π­Ρ‚ΠΎ всС для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΡ‹ Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ __cxa_begin/end_catch; Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ ΠΊΠ°ΠΊ эта ΠΏΠ°Ρ€Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚ landing pad β€” мСсто Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π³Π΄Π΅ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ ΠΎΠ±Ρ€Π°ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π§Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π½Π°Π΅ΠΌ β€” ΠΊΠ°ΠΊ landing pads ищутся. Unwind Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΊΠ°ΠΊ-Ρ‚ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π² стСкС, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ: ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π²Ρ‹Π·ΠΎΠ² (Ρ„Ρ€Π΅ΠΉΠΌ стСка для точности) Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΉ Π±Π»ΠΎΠΊ с landing pad, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ это ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π² Π½Π΅ΠΌ.

Π­Ρ‚ΠΎ Π½Π΅ΠΌΠ°Π»ΠΎΠ²Π°ΠΆΠ½ΠΎΠ΅ достиТСниС, ΠΈ ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΌΡ‹ выясним Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π»Π°Π²Π΅.

C++ exceptions ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ: gcc_except_table ΠΈ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ функция

Π Π°Π½Π΅Π΅ ΠΌΡ‹ выяснили, Ρ‡Ρ‚ΠΎ throw транслируСтся Π² ΠΏΠ°Ρ€Ρƒ __cxa_allocate_exception/throw, Π° catch-Π±Π»ΠΎΠΊ транслируСтся Π² __cxa_begin/end_catch, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΠΎΠ΅ CFI (call frame information) для поиска landing pads β€” Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ошибок.

Π§Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ Π΄ΠΎ сих ΠΏΠΎΡ€, это ΠΊΠ°ΠΊ _Unwind ΡƒΠ·Π½Π°Π΅Ρ‚, Π³Π΄Π΅ этот landing pads. Когда ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ пробрасываСтся сквозь связку Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² стэкС, всС CFI ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ разворачивания стэка ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π° функция сСйчас исполняСтся, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ· landing pads Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ позволяСт Π½Π°ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ (ΠΈ, ΠΊ слову, ΠΌΡ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с мноТСствСнными try/catch Π±Π»ΠΎΠΊΠ°ΠΌΠΈ!).

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Π³Π΄Π΅ ΠΆΠ΅ этот landing pads находится, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Π·ΠΎΠ²ΡƒΡ‰Π΅Π΅ сСбя gcc_except_table. Π’Π°Π±Π»ΠΈΡ†Π° эта ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½Π° (с мусором CFI) послС ΠΊΠΎΠ½Ρ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

Π­Ρ‚Π° сСкция .gcc_except_table β€” Π³Π΄Π΅ хранится вся информация для обнаруТСния landing pads, ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎΠ± этом ΠΏΠΎΠ·ΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Пока Ρ‡Ρ‚ΠΎ ΠΌΡ‹ лишь скаТСм, Ρ‡Ρ‚ΠΎ LSDA ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ β€” Π·ΠΎΠ½Π° с спСцифичными для языка Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ функция провСряСт Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ landing pads для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΎΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для запуска дСструкторов Π² процСссС разворачивания стэка).

ΠŸΠΎΠ΄Ρ‹Ρ‚ΠΎΠΆΠΈΠΌ: для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π³Π΄Π΅ Π΅ΡΡ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ catch-Π±Π»ΠΎΠΊ, компилятор транслируСт Π΅Π³ΠΎ Π² ΠΏΠ°Ρ€Ρƒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² cxa_begin_catch/cxa_end_catch ΠΈ, Π·Π°Ρ‚Π΅ΠΌ, ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ функция, вызываСмая __cxa_throw, Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ gcc_except_table для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π² стэкС для поиска Ρ‡Π΅Π³ΠΎ-Ρ‚ΠΎ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ LSDA. ΠŸΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ функция Π·Π°Ρ‚Π΅ΠΌ провСряСт, Π΅ΡΡ‚ΡŒ Π»ΠΈ Π² LSDA Π±Π»ΠΎΠΊ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΊΠΎΠ΄ очистки (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ запускаСт дСструкторы ΠΊΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ).

Π•Ρ‰Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ интСрСсный Π²Ρ‹Π²ΠΎΠ΄: Ссли ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ nothrow (ΠΈΠ»ΠΈ пустой ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ throw), компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ gcc_except_table для ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Π­Ρ‚ΠΎΡ‚ способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² gcc, Π½Π΅ сильно Π²Π»ΠΈΡΡŽΡ‰ΠΈΠΉ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ сильно влияСт Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π°. Π§Ρ‚ΠΎ касаСтся catch-Π±Π»ΠΎΠΊΠΎΠ²? Если ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ пробрасываСтся, ΠΊΠΎΠ³Π΄Π° объявлСн спСцификатор nothrow, LSDA Π½Π΅ гСнСрируСтся ΠΈ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ функция Π½Π΅ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅ΠΉ Π΄Π΅Π»Π°Ρ‚ΡŒ. Когда ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ функция Π½Π΅ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅ΠΉ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΎΠ½Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ошибок ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‡Ρ‚ΠΎ, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв, ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ выброс ошибки ΠΈΠ· nothrow ΠΌΠ΅Ρ‚ΠΎΠ΄Π° закончится std::terminate.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ функция, смоТСм Π»ΠΈ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘? Π§Ρ‚ΠΎ ΠΆ, посмотрим!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Python (try except)

П Ρ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, написанная Π½Π° языкС Python, останавливаСтся сразу ΠΊΠ°ΠΊ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Ошибки ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ (ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ) Π΄Π²ΡƒΡ… Ρ‚ΠΈΠΏΠΎΠ²:

Как устроСн ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

Π’ Python Π΅ΡΡ‚ΡŒ встроСнныС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ послС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π’ этом случаС Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ процСсс Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ приостанавливаСтся ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Π²Π΅Ρ€Ρ… Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΎΠ½Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ. Если ошибка Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π°, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ (Π° Π² консоли ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Traceback с ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΌ описаниСм ошибки).

💁‍♂️ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ : напишСм скрипт, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ функция ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ число, Π° ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ сроку (это Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ «TypeError»):

Π”Π°Π»Π΅Π΅ ошибка пСрСдаСтся ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ: » b » β†’ » a » β†’ » test.py «. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ Π½Π΅ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΠ»ΠΈΡΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ, вся информация ΠΏΠΎ ошибкС отобразится Π² консоли Π² Π²ΠΈΠ΄Π΅ Traceback.

Traceback (трассировка) β€” это ΠΎΡ‚Ρ‡Ρ‘Ρ‚, содСрТащий Π²Ρ‹Π·ΠΎΠ²Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹Π΅ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚. Врассировка ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ пошло Π½Π΅ Ρ‚Π°ΠΊ ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ мСстС это ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ.

Traceback Π»ΡƒΡ‡ΡˆΠ΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ снизу Π²Π²Π΅Ρ€Ρ… ↑

Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Traceback содСрТится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ (Ρ‡ΠΈΡ‚Π°Π΅ΠΌ снизу Π²Π²Π΅Ρ€Ρ…):

Как ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Python (try except)

НапримСр, Π²ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ дСлСния Π½Π° ноль:

try: a = 7 / 0 except: print(‘Ошибка! Π”Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0’)

Π—Π΄Π΅ΡΡŒ Π² Π±Π»ΠΎΠΊΠ΅ try находится ΠΊΠΎΠ΄ a = 7 / 0 β€” ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ выполнится ΠΊΠΎΠ΄ Π² Π±Π»ΠΎΠΊΠ΅ except (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ сообщСниС «ΠžΡˆΠΈΠ±ΠΊΠ°! Π”Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0»). ПослС этого ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ своС Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.

💭 PEP 8 Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅Ρ‚, ΠΏΠΎ возмоТности, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ послС ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова except (Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ):

try: a = 7 / 0 except ZeroDivisionError: print(‘Ошибка! Π”Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0’)

Однако Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ‚ΠΈΠΏ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Exception :

try: a = 7 / 0 except Exception: print(‘Π›ΡŽΠ±Π°Ρ ошибка!’)

As β€” сохраняСт ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½Π½Π°Ρ ошибка прСдставляСт собой ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса, унаслСдованного ΠΎΡ‚ «BaseException». Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова as ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ этот ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π½Π΅ΠΌΡƒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ° except :

try: file = open(‘ok123.txt’, ‘r’) except FileNotFoundError as e: print(e) > [Errno 2] No such file or directory: ‘ok123.txt’

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ ΠΌΡ‹ обращаСмся ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ класса «FileNotFoundError» (ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½Π° экран Ρ‡Π΅Ρ€Π΅Π· print отобразится строка с ΠΏΠΎΠ»Π½Ρ‹ΠΌ описаниСм ошибки).

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΅ΡΡ‚ΡŒ поля, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ссли Π½ΡƒΠΆΠ½ΠΎ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² собствСнном Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅):

import datetime now = datetime.datetime.now().strftime(«%d-%m-%Y %H:%M:%S») try: file = open(‘ok123.txt’, ‘r’) except FileNotFoundError as e: print(f» [FileNotFoundError]: , filename: «) > 20-11-2021 18:42:01 [FileNotFoundError]: No such file or directory, filename: ok123.txt

Finally β€” выполняСтся всСгда

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ try/except ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΈ восстановлСния Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния, Π° try/finally для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… дСйствий (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для закрытия Π²Π½Π΅ΡˆΠ½ΠΈΡ… рСсурсов, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ρ€Π°Π½Π΅Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹).

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΎΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ Ρ„Π°ΠΉΠ» ΠΈ обратимся ΠΊ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ строкС:

file = open(‘ok.txt’, ‘r’) try: lines = file.readlines() print(lines[5]) finally: file.close() if file.closed: print(«Ρ„Π°ΠΉΠ» Π·Π°ΠΊΡ€Ρ‹Ρ‚!») > Ρ„Π°ΠΉΠ» Π·Π°ΠΊΡ€Ρ‹Ρ‚! > Traceback (most recent call last): > File «test.py», line 5, in > print(lines[5]) > IndexError: list index out of range

p.s. Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ создан для дСмонстрации, Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ контСкста with.

Else β€” выполняСтся ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·Π²Π°Π½ΠΎ

Допустим Π½ΡƒΠΆΠ½ΠΎ вывСсти Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ дСлСния Π΄Π²ΡƒΡ… чисСл ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² случаС ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ дСлСния Π½Π° ноль:

b = int(input(‘b = ‘)) c = int(input(‘c = ‘)) try: a = b / c except ZeroDivisionError: print(‘Ошибка! Π”Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0’) else: print(f»a = «) > b = 10 > c = 1 > a = 10.0

Π’ этом случаС, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ присвоит ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ » с » ноль, Ρ‚ΠΎ появится ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ сообщСниС «‘Ошибка! Π”Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0′», Π° ΠΊΠΎΠ΄ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ° else Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Если ошибки Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Ρ‚ΠΎ Π½Π° экранС появятся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ дСлСния.

НСсколько блоков except

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ нСсколько ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π’ Python, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ ошибок, ΡΠΎΠ·Π΄Π°ΡŽΡ‚ нСсколько Π±Π»ΠΎΠΊΠΎΠ² except :

try: b = float(input(‘b = ‘)) c = float(input(‘c = ‘)) a = b / c except ZeroDivisionError: print(‘Ошибка! Π”Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0’) except ValueError: print(‘Число Π²Π²Π΅Π΄Π΅Π½ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎ’) else: print(f»a = «) > b = 10 > c = 0 > Ошибка! Π”Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° 0 > b = 10 > c = ΠΏΠΈΡ‚ΠΎΠ½ > Число Π²Π²Π΅Π΄Π΅Π½ΠΎ Π½Π΅Π²Π΅Ρ€Π½ΠΎ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² ошибок Π΅ΡΡ‚ΡŒ свой ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ.

НСсколько Ρ‚ΠΈΠΏΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² ΠΎΠ΄Π½ΠΎΠΌ Π±Π»ΠΎΠΊΠ΅ except

try: b = float(input(‘b = ‘)) c = float(input(‘c = ‘)) a = b / c except (ZeroDivisionError, ValueError) as er: print(er) else: print(‘a = ‘, a)

ΠŸΡ€ΠΈ этом ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ er присваиваСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·Π²Π°Π½ΠΎ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π° экран выводятся свСдСния ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ошибкС.

Raise β€” ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

min = 100 if min > 10: raise Exception(‘min must be less than 10’) > Traceback (most recent call last): > File «test.py», line 3, in > raise Exception(‘min value must be less than 10’) > Exception: min must be less than 10

ΠŸΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π°ΠΊΠΈΠ΅ сообщСния Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅:

min = 100 try: if min > 10: raise Exception(‘min must be less than 10’) except Exception: print(‘Моя ошибка’) > Моя ошибка

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² Π±Π»ΠΎΠΊΠ΅ except ΠΈ ΠΏΡ€ΠΎΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ дальшС (Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ стСку) с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ raise :

min = 100 try: if min > 10: raise Exception(‘min must be less than 10’) except Exception: print(‘Моя ошибка’) raise > Моя ошибка > Traceback (most recent call last): > File «test.py», line 5, in > raise Exception(‘min must be less than 10’) > Exception: min must be less than 10

Как ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ

Иногда ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ. Π’ этом случаС Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pass :

try: a = 7 / 0 except ZeroDivisionError: pass

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² lambda функциях

ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²Π½ΡƒΡ‚Ρ€ΠΈ lambda Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ нСльзя (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ lambda записываСтся Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ выраТСния). Π’ этом случаС Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

20 Ρ‚ΠΈΠΏΠΎΠ² встроСнных ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Python

Π˜Π΅Ρ€Π°Ρ€Ρ…ΠΈΡ классов для встроСнных ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Π² Python выглядит Ρ‚Π°ΠΊ:

ВсС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Python Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ BaseException :

ΠžΡ‚ Exception Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ:

1 StopIteration β€” вызываСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ next Π² Ρ‚ΠΎΠΌ случаС Ссли Π² ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈΡΡŒ элСмСнты;

2 ArithmeticError β€” ошибки, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈ вычислСнии, Π±Ρ‹Π²Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹:

3 AssertionError β€” Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ assert Π½Π΅Π²Π΅Ρ€Π½ΠΎ;

4 AttributeError β€” Ρƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° отсутствуСт Π½ΡƒΠΆΠ½Ρ‹ΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚;

5 BufferError β€” опСрация, для выполнСния ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ трСбуСтся Π±ΡƒΡ„Π΅Ρ€, Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°;

6 EOFError β€” ошибка чтСния ΠΈΠ· Ρ„Π°ΠΉΠ»Π°;

7 ImportError β€” ошибка импортирования модуля;

8 LookupError β€” Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΉ индСкс, дСлится Π½Π° Π΄Π²Π° Ρ‚ΠΈΠΏΠ°:

9 MemoryError β€” ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½Π°;

10 NameError β€” отсутствуСт пСрСмСнная с Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ;

11 OSError β€” ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой:

12 ReferenceError β€” ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° доступа ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ слабой ссылки, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π½Π΅ сущСствуСт;

13 RuntimeError β€” гСнСрируСтся Π² случаС, ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ классифицировано ΠΈΠ»ΠΈ Π½Π΅ ΠΏΠΎΠ΄ΠΏΠ°Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ΄ Π»ΡŽΠ±ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ;

14 NotImplementedError β€” абстрактныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ класса Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ;

15 SyntaxError β€” ошибка синтаксиса;

16 SystemError β€” сигнализируСт ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ ошибкС;

17 TypeError β€” опСрация Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ этого Ρ‚ΠΈΠΏΠ°;

18 ValueError β€” Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΊΠΎΠ³Π΄Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ пСрСдаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π½ΠΎ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅;

20 Warning β€” ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, нСкритичСская ошибка.

💭 ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ всю Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ наслСдования ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ модуля inspect :

Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ свой Ρ‚ΠΈΠΏ Exception

Π’ Python ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свои ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ΠŸΡ€ΠΈ этом Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ условиС: ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ класса Exception :

class MyError(Exception): def __init__(self, text): self.txt = text try: raise MyError(‘Моя ошибка’) except MyError as er: print(er) > Моя ошибка

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ try/except ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ ошибки Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ. Π­Ρ‚ΠΎ особСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ для критичСски Π²Π°ΠΆΠ½Ρ‹Ρ… частСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π³Π΄Π΅ Π»ΡŽΠ±Ρ‹Π΅ «ΠΏΠ°Π΄Π΅Π½ΠΈΡ» нСдопустимы (ΠΈΠ»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ привСсти ΠΊ Π½Π΅Π³Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ послСдствиям). НапримСр, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ «Π΄Π΅ΠΌΠΎΠ½», ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ΠΏΠΎΠ»Π½ΠΎΠΉ остановкС Π΅Ρ‘ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Или, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΌ сбоС соСдинСния с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Ρ€Π²Ρ‘Ρ‚ своё выполнСния (хотя ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΡ‚Π»ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒΡΡ Π² Π‘Π” Π·Π°Π½ΠΎΠ²ΠΎ).

ВмСстС с try/except ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ всС Π±Π»ΠΎΠΊΠΈ описанныС Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅, Ρ‚ΠΎ ΠΊΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

try: # ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ except (ZeroDivisionError, ValueError) as e: # ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠ° ZeroDivisionError ΠΈΠ»ΠΈ ValueError except Exception as e: # ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ ZeroDivisionError ΠΈ Π½Π΅ ValueError # поэтому ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° (унаслСдованноС ΠΎΡ‚ Exception) # сюда Π½Π΅ сходят ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠ° GeneratorExit, KeyboardInterrupt, SystemExit else: # этот Π±Π»ΠΎΠΊ выполняСтся, Ссли Π½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ # Ссли Π² этом Π±Π»ΠΎΠΊΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ return, ΠΎΠ½ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½, ΠΏΠΎΠΊΠ° Π½Π΅ выполнился Π±Π»ΠΎΠΊ finally finally: # этот Π±Π»ΠΎΠΊ выполняСтся всСгда, Π΄Π°ΠΆΠ΅ Ссли Π½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ else Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ # Ссли Π² этом Π±Π»ΠΎΠΊΠ΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ return, Ρ‚ΠΎ return Π² Π±Π»ΠΎΠΊΠ΅

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *