[Rust] panic
panic์ Rust์ ์ค๋ฅ ์ฒ๋ฆฌ ์๋จ ์ค ํ๋๋ค.
์ ํํ๋ ์์คํ
์ด ์ค๋จ๋ ์ ์๋ ์ ๋์ ์ฌ๊ฐํ ์ค๋ฅ๋ฅผ ๋ฐฉ์ถํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
๊ธฐ๋ณธ ์๋ฆฌ
rust์ panic์ ์ฌํ ์ธ์ด๋ค์ try-catch์๋ ์ ์ฌํ ๋ถ๋ถ์ด ์๋ค.
panic์ด ๋ฐ์ํ๋ฉด rust๋ ํจ์ ํธ์ถ ์คํ์ ๊ฑฐ๊พธ๋ก ์ฌ๋ผ๊ฐ๋ฉด์ ์คํ ๋ฆฌ์์ค๋ฅผ ํ๋์ฉ ์ข
๋ฃํ๋ค.
์ด ์์
์ unwind๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋์ถฉ ์ด๋ ๋ค.
unwind๋ก ๋๊น์ง ์ฌ๋ผ๊ฐ๋๋ฐ๋ ๋ญ๊ฐ ์๋ค๋ฉด ํ๋ก๊ทธ๋จ์ ๊ทธ๋๋ก ๊ฐ์ ์ข
๋ฃ๋๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
๊ธฐ๋ณธ์ ์ผ๋ก ํจ๋์ ์ ์ฉ ๋งคํฌ๋ก panic!์ ํตํด์ ๋ฐ๋ก ๋์ง ์ ์๋ค.
์ด๊ฑด ํน์ํ๊ฒ ์ ์๋ ๋นํธ์ธ ํจ๋ ํธ๋ค๋ฌ๋ฅผ ์ฆ์ ํธ์ถํ๋ค.
๊ทธ๋ฆฌ๊ณ ์์์ ์ค๋ช
ํ๋๋๋ก panic unwind๋ฅผ ์ํํ๋ฉด์ panic trace๋ฅผ ์ฐ๊ณ , ํ๋ก๊ทธ๋จ์ ์ค๋จ์ํจ๋ค.
panic ์ก๊ธฐ
ํ์ง๋ง panic๋ ํ์ํ๋ค๋ฉด try-catch์ฒ๋ผ ๋ฐ์์ ํ๋ก๊ทธ๋จ์ด ํฐ์ง์ง ์๋๋ก ์ ์ดํ ์ ์๋ค.
catch_unwind๋ผ๋ ํจ์์ ํด๋ก์ ๋ก ๊ฐ์ธ์ ํจ๋์ด ๋ฐ์ ๊ฐ๋ฅํ ๋ก์ง์ ์คํ์ํค๋ฉด, ๋ด๋ถ์์ ํจ๋์ด ๋ฐ์ํ๋๋ผ๋ ์ค๋ฅ๋ฅผ Result๋ก ๋ฐํํด์ค๋ค.
์ด๋ฐ ์์ผ๋ก ์ฐ๋ฉด ๋๋ค.
panic trace๋ ์๋์ผ๋ก ์ฐํ๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ์ค์ ์ผ๋ก๋ ๋ฌด์ํ ์๊ฐ ์๋ค.
์ด์ฒ๋ผ try-catch์ฒ๋ผ ์ธ ์ ์๊ธด ํ๋ฐ, ์ผ๋ฐ์ ์ผ๋ก ๊ถ์ฅ๋๋ ํํ๋ ์๋๋ค.
์ด๊ฑด ํน์๋ ๋ชจ๋ฅผ ํจ๋ ์ํฉ์ ๋ฐฉ์งํ๊ณ ๊ฐ์ฉ์ฑ์ ์ฑ๊ธฐ๊ณ ์ถ์ ๋, ์ต์์๋ ๋ฒจ์์ ๋ณดํ์ฉ์ผ๋ก ๊น์์ฃผ๋ ์ฉ๋๋ก ์๊ฐํ๋ฉด ๋๋ค.
๋ํ์ ์ผ๋ก ์๋ฒ ํ๋ ์์ํฌ๋ฅผ ๋ง๋ ๋ค๊ณ ํ๋ค๋ฉด ์ด์ ๋๋ ๊น์์ค์ผ ํ๋ค.
thread์ panic
๋คํํ๋ rust์์๋ ์ค๋ ๋ ๋ด์์ ํจ๋์ด ๋ฐ์ํ๋ค๊ณ ํด์ ๋ฉ์ธ ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋์ง๋ ์๋๋ค.
๊ทธ ์ค๋ ๋๋ง ๋ป๊ณ trace๋ฅผ ์ฐ์ ๋ฟ์ด๋ค.
๋์ join ๊ฐ์ ๊ฒ์ด ์คํจํ ์๋ ์๋ค.
๊ทธ๋ฆฌ๊ณ thread๊ฐ ๋ป์ ๊ฒฝ์ฐ์๋ ๊ทธ ์ปจํ
์คํธ์์ ์ฌ์ฉํ mutex๊ฐ ๊ณ ์ฅ๋ ์ ์๋ ์ํ์ด ์กด์ฌํ๋ค.
์ด๊ฑธ ์ค๋
๋์๋ค.(poisoned)๊ณ ํํํ๋ค. ์ด ์ํ๋ก lock์ ์ป์ผ๋ฉด ์คํจํ๋ค.
๊ทธ๋๋ ์์ ์๋ mutex๊ฐ ํ๋ฒ poison์ ๊ฑธ๋ฆฌ๋ฉด ๋ป๊ฐ์ ๋ณต๊ตฌํ ์๊ฐ ์์๋๋ฐ, ์ด์ ๋ clear_poison์ผ๋ก ์ด๊ธฐํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
panic unwind ๋นํ์ฑํํ๊ธฐ
panic์ด ๋ฐ์ํ๋ฉด rust๋ unwind๋ฅผ ํตํด์ ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋ค๊ณ ํ์๋ค.
ํ์ง๋ง ์ด๋ฌํ ์ฒ๋ฆฌ ์ฝ๋๋ง์ ์ค์ด๊ณ ์ถ์ ๋๊ฐ ์๋ค.
์ด๋ ๊ฒ ๋น๋ ์ต์
์ panic = 'abort'๋ฅผ ๋ฃ์ผ๋ฉด panic unwind์ ๋ํ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ๋ฐ์ด๋๋ฆฌ์์ ์ ๊ฑฐ๋๋ค.
๊ทธ๋ฌ๋ฉด ๋ฆฌ์์ค ์ ๋ฆฌ๋ ์์ฒด ๋ฐ์ด๋๋ฆฌ๊ฐ ์๋๋ผ OS๊ฐ ์ฒ๋ฆฌํ๊ฒ ๋๋ค. ์งฌ์ ๋๋ฆฌ๋ ๊ฒ์ด๋ค.
์๋ฒ ๋๋ ๊ฐ์ ์ปดํฉํธํ ํ๊ฒฝ์์๋ ๋ฐ์ด๋๋ฆฌ ์ฌ์ด์ฆ๋ฅผ ์กฐ๊ธ์ด๋ผ๋ ๋ ์ค์ด๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์, ์ฝ๊ฐ์ ํธ์์ฑ์ ํฌ์ํ๋๋ผ๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์ ํํ ๋๊ฐ ์ข ์ข ์๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ catch_unwind ๊ฐ์ ๊ฒ๋ ๋จนํ์ง ์๊ณ ๋ฐ๋ก ์ค๋จ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์์ฐ์ ์ธ panic ์ํฉ
panic์ panic! ํจ์๋ฅผ ํตํด์๋, ๊ทธ๊ฑธ ์ฌ์ฉํ๋ .unwrap() ๊ฐ์ ํจ์๋ค์ ํตํด์๋ ๋ฐ์ํ์ง๋ง, ๊ธฐ๋ณธ ์ ํ์ค ์์ค์์ ๋ฐ์ํ๋ ํจ๋๋ ๋ช๊ฐ์ง ์๋ค.
๊ฐ์ฅ ๋ํ์ ์ธ ๊ฒ์ ๋ฐฐ์ด์ out of range ์ค๋ฅ๋ค. ์กด์ฌํ์ง ์๋ ์ธ๋ฑ์ค๋ฅผ ์ฐธ์กฐ ์๋ํ๋ฉด ๋ฐ๋ก ํจ๋์ด ํฐ์ง๋ค.
์์ ํ ์ ๊ทผ์ ์ํ๋ค๋ฉด .get ๊ฐ์ ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.

Rust์์๋ ์ค๋ฒํ๋ก์ ์ธ๋ํ๋ก๋ ํจ๋์ ์ ๋ฐํ๋ค.
์ ์ ๋ถ์์ผ๋ก ๊ฐ์ง๋๋ ๊ฒฝ์ฐ๋ ์ปดํ์ผ ์์ค์์ ๊ฑธ๋ฌ์ง์ง๋ง, ๋ฐํ์์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๋ ๋ฐํ์ ํจ๋์ด๋ค.
์ด๋ฐ๊ฑธ ๋ฐฉ์งํ๋ ค๋ฉด .wrapping_add ๊ฐ์ ์ค๋ฒํ๋ก ๋ณดํธ ์ฐ์ฐ์ ์ฌ์ฉํ๋ ํธ์ด ์ข๋ค.
์ซ์๋ฅผ 0์ผ๋ก ๋๋๋ ๊ฒ๋ ๊ธฐ๋ณธ ํจ๋์ ์ํ๋ค.
์ด๊ฑด ๋น์ฐํ ์์์ ์ ํผํด์ผ ํ๋ค. ์ด๋ฐ๊ฑฐ ํ์ฉํ๋ ์ธ์ด๋ ๋๋ฌผ๋ค.
์ฐธ์กฐ
https://doc.rust-lang.org/book/ch09-01-unrecoverable-errors-with-panic.html
https://doc.rust-lang.org/std/macro.panic.html
https://doc.rust-lang.org/nomicon/unwinding.html