๐ Error Handling
Swift๋ Error protocol์ ํตํด Error handling์ ์ง์ํ๋ค.
๐ Ways to handle Errors
์ค์ํํธ์ ์๋ฌ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ๋ค๊ฐ์ง๊ฐ ์๋ค.
- Error ๋ฐ์ ํจ์์์ ํด๋น ํจ์๋ฅผ ํธ์ถํ ์ฝ๋๋ก ์ ํ(๋์ง) (thorws)
- do-catch๋ฌธ์ผ๋ก ์ฒ๋ฆฌ
- Error๋ฅผ ์ต์ ๋๊ฐ์ผ๋ก ์ฒ๋ฆฌ
- Error๊ฐ ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋จ์
๐ฟ Error Represent
Swift์์, Error๋ Error protocol์ ์ค์ํ๋ ํ์ ์ ๊ฐ์ผ๋ก ํํํ๋ค.
๐น Error Protocol์ ๋น ํ๋กํ ์ฝ์ด๋ค.
Any type that declares conformance to the Error protocol can be used to represent an error in Swift’s error handling system. Because the Error protocol has no requirements of its own, you can declare conformance on any custom type you create.
Example
enum AnythingError: Error {
case notingExist
}
๐คก Error ๋ฐ์ ํจ์์์ ํด๋น ํจ์๋ฅผ ํธ์ถํ ์ฝ๋๋ก ์ ํ - thorws
func canThrowErrors() throws -> String
func cannotThrowErrors() -> String
throwsํจ์๋ง์ด ์๋ฌ๋ฅผ ์ ํํ ์ ์๋ค.
nonthrows ํจ์์์ ๋ฐ์ํ ์๋ฌ๋ ์ด๋ค ๊ฒ์ด๋ ๋ฐ๋์ ํจ์ ๋ด๋ถ์์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
let anything = [1, 2, 3]
func canThrowErrors(anything : Int) throws -> String {
guard let existAnything = anything[anything] else {
throw nothingExist
}
}
์ ํ๋ผ๋ฏธํฐ๋ช ์๋ง์ธ ์ฝ๋์ throws -> String์ thorws๋ฅผ Stringํ์ ์ผ๋ก ํ๊ฒ ๋ค๋๊ฒ ์๋๋ผ ํจ์์ ๋ฐํํ์ ์ ์ง์ ํ ๊ฒ์ด๋ค.
guard์ ์กฐ๊ฑด์ ํต๊ณผํ์ง ๋ชปํ๋ฉด else์ ์๋ nothingExist error๋ฅผ ๋์ง๊ฒ ๋ค๋ ๊ฒ์ด๋ค.
๐บ do-catch๋ฌธ์ผ๋ก ์ฒ๋ฆฌ
throws ํจ์๋ฅผ ํธ์ถํ ๋๋ try๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
do ์ ์์ tryํ ์ฝ๋๊ฐ ์๋ฌ๋ฅผ ๋์ง๋ฉด, catch๋ฅผ ์ฌ์ฉํ์ฌ error์ ๋ง์ถฐ ์ฒ๋ฆฌํ๋ค.
๐พ do-catch์ ํ์
do {
try (throws ํจ์)
statements
} catch error๋ช
1 {
statements
} catch error๋ช
12 where condition {
statements
} catch {
statements
}
๐ฝ Error๋ฅผ ์ต์ ๋๊ฐ์ผ๋ก ์ฒ๋ฆฌ - try?
try?๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ๋๊ฐ์ผ๋ก ๋ณํํจ์ผ๋ก์จ error๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
error ๋ฐ์์ nil์ ๋ฐํํ๊ณ , error๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ๋ฐํ ํ์ ์ ์ต์ ๋์ด ๋๋ค.
if let data = try? getData() {
return data
}
์ ์ฝ๋๋ getData()์์ error๊ฐ ๋ฐ์ํ๋ฉด nil์ ๋ฐํํ์ฌ ์ต์ ๋ ๋ฐ์ธ๋ฉ์ธ if let ๋ด๋ถ๊ฐ ์คํ๋์ง ์๋ ๊ฒ์ด๋ค.
โ ๏ธ Error๊ฐ ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋จ์ - try!
ํจ์๋ ๋ฉ์๋์์ error๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ค.
๋ฐํํ์ ์ Non-Optional์ด๋ค.
try!๋ฅผ ์ฌ์ฉํ๋๋ฐ error๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ Runtime error๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
let image = try! loadImg(atPath: "./Resources/mainLogo.jpg")
์ ์ฝ๋๋ loadImg() ํจ์์์ error๊ฐ ๋ฐ์ํ์ง ์๋๋ค๋ฉด ์ ์์ ์ผ๋ก ์์์ ๊ฐ์ด ๋ค์ด๊ฐ์ง๋ง, error๊ฐ ๋ฐ์ํ๋ค๋ฉด ๋ํ๋์ง์์ nil์ด ๋์ค๋ฉด์ Runtime error๋ฅผ ๋ฐ์์ํค๊ฒ ๋๋ค.
๋น์ฐํ ๋จ๋ฐํ๋ฉด ์ข์ง์์ ๊ฒ์ด๋ค.
๐ ๊ทธ๋ฅ ๋๊ตฐ๊ฐ ๋ณด๋ฉด์ ํท๊ฐ๋ ค ํ ๊น๋ด ์ ๋ ๊ฒ
ํจ์์ ๋ฉ์๋๋ ์ด๋ ํ ๊ธฐ๋ฅ์ ์ํํ๋ ๊ฒ
ํจ์์ ๋ฉ์๋์ ์ฐจ์ด๋ ๋ฉ์๋๋ ํด๋์ค ๋ฐ ๊ฐ์ฒด์ ์ฐ๊ด๋์ด ์๋ ํจ์๋ผ๋ ๊ฒ
๋ํ์ ์ผ๋ก ํด๋์ค ๋ด์ ์ ์ธ๋์ด ์๋ ํจ์๋ฅผ ๋ฉ์๋ ๋ผ๊ณ ์นญํจ
์ฌํผ ๋ฉ์๋๋ ํจ์๋ค.
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Swift) return์ ๋ํ ์๋ฌธ (0) | 2022.02.12 |
---|---|
Swift) Switch vs If else (0) | 2022.02.12 |
ํจ์ ์ ๋ฌ์ธ์๋ช ๊ณผ ํ๋ผ๋ฏธํฐ๋ช (0) | 2022.02.12 |
Swift) Optional Binding (0) | 2022.02.10 |
[Swift] Closure (0) | 2021.09.24 |
๋๊ธ