enum에 오류타입명 정의
enum ApiError : Error {
case badUrl
case parsingError
case noContent
case decodingError
case badStatus(code: Int)
case unknownError(_ error: Error)
}오류가 나는 조건을 명시&오류 던지기(보내기): throws와 throw로 선언
throws를 -> 앞에 표시한다
반환 전에 오류가 발생하면, 오류 객체를 반환한다는 것을 의미한다
public func parse(_ value: String) throws -> Format.FormatInput

do-try-catch로 오류 처리하기(throw를 통해서 던진 에러 받아서 처리하기)
try의 의미: 아,,, 에러 날수 있기는 한데 일단 한번 해보기는 할께,,,
try의 종류
- try: 예외 발생시 catch로 예외 정보를 던지며, 성공하는 경우 언랩핑된 값을 반환한다
- try!: 함수 강제 실행
- 런타임 오류가 발생할 수 있다
- try? : 에러가 발생하면 nil리턴
- 에러가 발생하지 않으면 Optional타입으로 리턴된다


import UIKit
enum MyError: Error { //Error를 카테고리로 정리
case numberError
}
func saySomething(number: Int) async throws -> String { //'saySomething이라는 함수는 에러를 던질거야'를 표시 -> throws
if number == 3 {
throw MyError.numberError //'MyError.numberError라는 에러를 던질거야' -> throw
}
return "마이넘버: \(number)"
}
Task{
do { //try인 구문을 실행을 할꺼야
let result1 = try await saySomething(number: 2) //'에러가 날 수도 있는데 시도는 해볼께' -> try
let result2 = try? await saySomething(number: 1) //'에러가 날 수도 있는데 시도도 해볼꺼야 근데 에러는 처리하지 않을 꺼야' -> try?
let result3 = try await saySomething(number: 3) //여기서는 에러 발생
} catch { //에러가 날 경우 catch를 통해서 에러를 잡아서 해결할거야
print("error: \(error)") //catch에서는 그냥 error라고 들어온다 //error: numberError\n
}
}