Π§ΡΠΎ ΡΠ»ΡΡΠΈΡΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ 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. ΠΠ°ΠΊΠΎΠ²Π° ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ.
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π΅Π»ΡΡΡΡ Π½Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΊΠ»Π°ΡΡΠΎΠ², Π½ΠΎ Π²ΡΠ΅ ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡΡ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΏΡΠ΅Π΄ΠΊΠ° β ΠΊΠ»Π°ΡΡ 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++
ΠΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°
ΠΠ° Ρ Π°Π±ΡΠ΅ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠ°ΡΠ΅ΠΉ, ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΡ ΠΈ Π½Π΅ ΠΎΡΠ΅Π½Ρ (ΠΏΡΠΈ ΡΡΠΎΠΌ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Ρ ΠΎΡΠΎΡΠΈΡ ), ΠΏΠΎΡΠ²ΡΡΠ΅Π½Π½ΡΡ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ 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»
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 Π² Π±Π»ΠΎΠΊΠ΅