- 프로그램에서 에러 발생 : 프로그램 실행 중에 예기치 못한 상황이 발생한 상태로 프로그램이 강제 종료되어 앱이 크래쉬되는 상황 또는 제대로 동작을 수행하지 못하는 상황이 발생한 상태를 의미한다.
예) 파일 처리 중 디스크 에러, 파일 처리 중 권한 부족으로 인한 에러 - 에러 발생 시 사용하는 API
- 메소드에 throws 키워드를 넣어 선언throws 로 선언
// 메소드 선언 시에 throws 키워드 사용하여 선언
func openFile(toFile : String) throws {
// 파일 열기에 대한 동작 정의
}
/* throws로 선언한 메소드는 반드시 try 키워드를 붙여서 사용*/
try str.openFile(toFile : sFilePath)
/* 위 상태에서 에러 발생해도 강제 종료가 되며 3번 에러 다루기에서 강제 종료가 발생되지 않도록 처리부분 정의*/ - Error 프로토콜을 채택한 객체의 에러 반환throw 를 이용한 에러 반환
/* Enum으로 Error 프로토콜을 채택하여 커스텀 에러 정의
자세한 것은 4번 커스텀에러에서 다룬다.
*/
enum CustomError : Error {
case myFault
case yourFault
}
// 정의된 에러 반환
func inputPositive(val : Int) throws {
guard (val > 0) else {
throw CustomError.yourFault // 에러 반환
// Error 프로토콜을 채택하면 반환
}
print("정상 수행")
} - 에러 다루기
- 에러가 발생하면 앱의 강제 종료를 방지하기 위해서 do-catch 문을 사용한다.
- do 내에 코드 실행 중 에러가 발생하게 되면 catch 내 코드를 실행하게 된다.do-catch 문 사용
// 메소드 선언 시에 throws 키워드 사용하여 선언
func openFile(toFile : String) throws {
// 파일 열기에 대한 동작 정의
}
do {
try str.openFile(toFile : sFilePath)
} catch {
print("파일 열기 중 에러 발생")
}
/* do 블록 내의 코드 실행 중에 에러 발생 시 catch 블록 내의 코드를 실행한다.*/ - do-catch문은 자바의 try-catch문과 유사하다.do-catch 문 사용 (Swift)try-catch 문 사용 (Java)
do {
// 에러 발생 가능 코드
try obj.throwsMethod
} catch {
// 에러 발생 처리 코드
}try {
// 에러 발생 가능 코드
} catch(exception e) {
// 에러 발생 처리 코드
} - 커스텀 에러
- 특정 에러를 별도로 정의해서 사용하는 것으로 Error 프로토콜을 채택하여 사용한다.
커스텀 에러 정의
// enum을 이용한 정의 ()
enum CustomError : Error {
case myFault
case yourFault
}
// enum으로 정의된 에러 다루기
do {
throw CustomError.yourFault
} catch CustomError.myFault {
print("내탓")
} catch CustomError.yourFault {
print("니탓")
}
// Switch-Case와 비슷하게 사용
// 구조체를 이용한 정의
struct CustomErrorStruct : Error {
var msg : String
}
// 클래스를 이용한 정의
class CustomErrorClass : Error {
}
// 구조체나 클래스는 where을 이용한 타입 체크로 구분
do {
// 에러 발생 시키기
let error = CustomErrorStruct(msg : "Oh! My God!!")
throw error // 에러 반환
} catch where error is CustomErrorStruct {
print("구조체로 작성한 에러 발생")
} catch where error is CustomErrorClass {
print("클래스로 작성한 에러 발생")
} - 클린업(defer)
- 에러가 발생여부와 상관없이 끝나기 전에 블록 내의 코드를 실행한다.
- 에러가 발생해도 실행되고, 정상 종료 시에도 실행된다.
- 자바의 try-catch-finally에서 finally와 유사한 기능이다.
- 사용 방법defer 사용법
// defer는 예외가 발생하는 곳에 작성
func dangerousFunc() throws {
defer{
print("메소드 실행 후 마지막 동작 정의")
}
// throw 보다 이전에 작성한다.
throw CustomErrorStruct(msg : "에러 발생")
}