์๋ ํ์ธ์. ์ด๋ฒ์๋ Objective-C์ ์์ธ ์ฒ๋ฆฌ(Exception Handling)์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๐ Objective-C ์์ธ ์ฒ๋ฆฌ ๊ฐ์
Objective-C ์ธ์ด๋ Java๋ C++๊ณผ ์ ์ฌํ ์์ธ ์ฒ๋ฆฌ ๊ตฌ๋ฌธ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ตฌ๋ฌธ์ NSException, NSError ๋๋ ์ฌ์ฉ์ ์ ์ ํด๋์ค์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์์ธ(Exception): ํ๋ก๊ทธ๋จ์ ์ ์์ ์ธ ์คํ ํ๋ฆ์ ์ค๋จ์ํค๋ ํน๋ณํ ์กฐ๊ฑด์ผ๋ก, ๋ค์ํ ์ค๋ฅ ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
๐ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ ํ์ฑํํ๊ธฐ
Objective-C์์ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ ค๋ฉด GNU ์ปดํ์ผ๋ฌ ์ปฌ๋ ์ (GCC) ๋ฒ์ 3.3 ์ด์์์ -fobjc-exceptions ์ค์์น๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ฐธ๊ณ : ์ด ์ค์์น๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ OS X v10.3 ์ด์์์๋ง ์คํํ ์ ์์ต๋๋ค. ์ด์ ๋ฒ์ ์์๋ ์์ธ ์ฒ๋ฆฌ์ ๋๊ธฐํ๋ฅผ ์ํ ๋ฐํ์ ์ง์์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ ์์ธ ์ฒ๋ฆฌ ๊ธฐ๋ณธ ๊ตฌ์กฐ
์์ธ๋ ํ๋ก๊ทธ๋จ ์คํ์ ์ ์์ ์ธ ํ๋ฆ์ ์ค๋จ์ํค๋ ํน๋ณํ ์กฐ๊ฑด์ ๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋(์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ํ๊ฑฐ๋ ๋์ ธ์ง๋ค๊ณ ํํ) ์ด์ ๋ ๋ค์ํฉ๋๋ค:
- 0์ผ๋ก ๋๋๊ธฐ์ ๊ฐ์ ์ฐ์ ์ค๋ฅ
- ์ธ๋ํ๋ก์ฐ๋ ์ค๋ฒํ๋ก์ฐ
- ์ ์๋์ง ์์ ๋ช ๋ น ํธ์ถ(์: ๊ตฌํ๋์ง ์์ ๋ฉ์๋ ํธ์ถ)
- ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ปฌ๋ ์ ์์ ์ ๊ทผ ์๋
Objective-C ์์ธ ์ง์์ ๋ค ๊ฐ์ง ์ปดํ์ผ๋ฌ ์ง์์ด๋ฅผ ํฌํจํฉ๋๋ค:
@try ๋ธ๋ก
์ ์ฌ์ ์ผ๋ก ์์ธ๋ฅผ ๋์ง ์ ์๋ ์ฝ๋๋ @try{} ๋ธ๋ก ์์ ๋ฃ์ต๋๋ค.
@try {
// ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ ์ฝ๋
}
@catch ๋ธ๋ก
@catch{} ๋ธ๋ก์ @try{} ๋ธ๋ก์์ ๋์ ธ์ง ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ํฌํจํฉ๋๋ค. ๋ค์ํ ์ ํ์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ๋ฌ @catch{} ๋ธ๋ก์ ๊ฐ์ง ์ ์์ต๋๋ค.
@catch (NSException *exception) {
// ์์ธ ์ฒ๋ฆฌ ์ฝ๋
}
@throw ์ง์์ด
@throw ์ง์์ด๋ ์์ธ๋ฅผ ๋์ง๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋์ ธ์ง๋ ์์ธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Objective-C ๊ฐ์ฒด์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก NSException ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ง๋ง ํ์๋ ์๋๋๋ค.
@throw exception;
@finally ๋ธ๋ก
@finally{} ๋ธ๋ก์ ์์ธ๊ฐ ๋์ ธ์ง๋ ๊ทธ๋ ์ง ์๋ ๋ฐ๋์ ์คํ๋์ด์ผ ํ๋ ์ฝ๋๋ฅผ ํฌํจํฉ๋๋ค.
@finally {
// ์ ๋ฆฌ ์ฝ๋
}
์์ ์ฝ๋
๋ค์์ ๊ฐ๋จํ ์์ธ ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ณด์ฌ์ค๋๋ค:
Cup *cup = [[Cup alloc] init];
@try {
[cup fill];
}
@catch (NSException *exception) {
NSLog(@"main: Caught %@: %@", [exception name], [exception reason]);
}
@finally {
[cup release];
}
NSException: Objective-C์์ ์์ธ๋ฅผ ๋ํ๋ด๋ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค.
๐ ๋ค์ํ ์ ํ์ ์์ธ ์ฒ๋ฆฌํ๊ธฐ
@try{} ๋ธ๋ก์์ ๋์ ธ์ง ์์ธ๋ฅผ ์ก์ผ๋ ค๋ฉด @try{} ๋ธ๋ก ๋ค์์ ํ๋ ์ด์์ @catch{} ๋ธ๋ก์ ์ฌ์ฉํฉ๋๋ค. @catch{} ๋ธ๋ก์ ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ๊ฒ๋ถํฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๊ฒ ์์ผ๋ก ์ ๋ ฌํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค์ ์์ ์ ๊ฐ์ด ์์ธ ๊ทธ๋ฃน๋ณ๋ก ์ฒ๋ฆฌ๋ฅผ ๋ง์ถคํํ ์ ์์ต๋๋ค:
@try {
// ์ ์ฌ์ ์ผ๋ก ์์ธ๋ฅผ ๋์ง๋ ์ฝ๋
}
@catch (CustomException *ce) { // 1. ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ์์ธ ์ ํ์ ์ก์ต๋๋ค.
// CustomException ์ฒ๋ฆฌ ์ฝ๋
}
@catch (NSException *ne) { // 2. ๋ ์ผ๋ฐ์ ์ธ ์์ธ ์ ํ์ ์ก์ต๋๋ค.
// ์ด ์์ค์์ ํ์ํ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
}
@catch (id ue) { // ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์์ธ - ๋ชจ๋ ๊ฐ์ฒด
// ๊ธฐํ ๋ชจ๋ ์์ธ ์ฒ๋ฆฌ
}
@finally { // 3. ์์ธ ๋ฐ์ ์ฌ๋ถ์ ๊ด๊ณ์์ด ํญ์ ์ํํด์ผ ํ๋ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
// ์ ๋ฆฌ ์ฝ๋
}
์์ธ ๊ณ์ธต(Exception Hierarchy): ๋ ๊ตฌ์ฒด์ ์ธ ์์ธ๋ถํฐ ๋ ์ผ๋ฐ์ ์ธ ์์ธ ์์ผ๋ก catch ๋ธ๋ก์ ๋ฐฐ์นํด์ผ ํฉ๋๋ค.
๐ ์์ธ ๋์ง๊ธฐ(Throwing Exceptions)
์์ธ๋ฅผ ๋์ง๋ ค๋ฉด ์์ธ ์ด๋ฆ๊ณผ ๋์ ธ์ง ์ด์ ์ ๊ฐ์ ์ ์ ํ ์ ๋ณด๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์ธ์คํด์คํํด์ผ ํฉ๋๋ค:
NSException *exception = [NSException exceptionWithName: @"HotTeaException"
reason: @"The tea is too hot"
userInfo: nil];
@throw exception;
@catch{} ๋ธ๋ก ๋ด์์ ์ธ์๋ฅผ ์ ๊ณตํ์ง ์๊ณ @throw ์ง์์ด๋ฅผ ์ฌ์ฉํ์ฌ ์กํ ์์ธ๋ฅผ ๋ค์ ๋์ง ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ธ์๋ฅผ ์๋ตํ๋ฉด ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
@catch (NSException *exception) {
// ์ผ๋ถ ์ฒ๋ฆฌ ์ํ
@throw; // ๋์ผํ ์์ธ๋ฅผ ๋ค์ ๋์ง๋๋ค
}
์์ธ ๋ค์ ๋์ง๊ธฐ(Rethrowing): ์์ธ๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ์ฒ๋ฆฌํ ํ ํธ์ถ ์คํ์ ์์ ๋ ๋ฒจ์์ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ๋ค์ ๋์ง๋ ๊ธฐ์ ์ ๋๋ค.
๐ ์์ธ ์ฌ์ฉ ์ ์ค์ํ ๊ณ ๋ ค ์ฌํญ
Objective-C์์ ์์ธ๋ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ ์ผ๋ฐ์ ์ธ ํ๋ฆ ์ ์ด๋ ๋จ์ํ ์ค๋ฅ๋ฅผ ํ์ํ๊ธฐ ์ํด ์์ธ๋ฅผ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. ๋์ ๋ฉ์๋๋ ํจ์์ ๋ฐํ ๊ฐ์ ์ฌ์ฉํ์ฌ ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ ๋ํ๋ด๊ณ , ์ค๋ฅ ๊ฐ์ฒด์ ๋ฌธ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
NSError: Objective-C์์ ์์ธ ๋์ ์ค๋ฅ ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํด๋์ค์ ๋๋ค.
๋ํ NSException ๊ฐ์ฒด๋ง ๋์ง ์ ์๋ ๊ฒ์ ์๋๋๋ค. ์ด๋ค Objective-C ๊ฐ์ฒด๋ ์์ธ ๊ฐ์ฒด๋ก ๋์ง ์ ์์ต๋๋ค. NSException ํด๋์ค๋ ์์ธ ์ฒ๋ฆฌ์ ๋์์ด ๋๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ง๋ง, ์ํ๋ ๊ฒฝ์ฐ ์ง์ ๊ตฌํํ ์๋ ์์ต๋๋ค. ๋ํ NSException์ ์๋ธํด๋์ฑํ์ฌ ํ์ผ ์์คํ ์์ธ๋ ํต์ ์์ธ์ ๊ฐ์ ํน์ํ ์ ํ์ ์์ธ๋ฅผ ๊ตฌํํ ์๋ ์์ต๋๋ค.
// ์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค ์ฌ์ฉ ์
@try {
if (![self connectToServer]) {
NetworkException *exception = [[NetworkException alloc]
initWithName:@"ConnectionFailure"
reason:@"์๋ฒ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค"
userInfo:nil];
@throw exception;
}
}
@catch (NetworkException *ne) {
// ๋คํธ์ํฌ ๊ด๋ จ ์์ธ ์ฒ๋ฆฌ
}
๋ง๋ฌด๋ฆฌ
Objective-C์ ์์ธ ์ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ํ๋ก๊ทธ๋จ ์์ ์ฑ์ ๋์ด๋ ๋ฐ ์ค์ํ ๋๊ตฌ์ ๋๋ค. ํ์ง๋ง Objective-C์์๋ ์์ธ๊ฐ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์๋ชจํ๋ฏ๋ก, ์ผ๋ฐ์ ์ธ ์ค๋ฅ ์ฒ๋ฆฌ์๋ NSError๋ฅผ ์ฌ์ฉํ๊ณ ์์ธ๋ ์ ๋ง ์์ธ์ ์ธ ์ํฉ์๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
'๐ฅ Bread Basics > Obj-c' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ค๋ ๋ฉ๊ณผ ๋๊ธฐํ (0) | 2025.04.14 |
---|---|
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ๋ ํฐ(Selector) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ์ ๋์ ์ดํดํ๊ธฐ (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๋น ๋ฅธ ์ด๊ฑฐ(Fast Enumeration) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ฐ๊ด ์ฐธ์กฐ(Associative References) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - Categories์ Extensions (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ์ธ๋ ํ๋กํผํฐ(Declared Properties) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํ๋กํ ์ฝ (0) | 2025.04.14 |