Skip to content

에러 핸들링

Hyemin Heo edited this page Jan 12, 2025 · 1 revision

에러 타입 나누기

레이어 단위라면 Supabase 레이어 내부에서 발생할 수 있는 에러 상황을 모두 하나의 타입에 저장해야 한다.

하지만 Auth, DB, Storage 각각의 에러의 성격이 달라서 ex) 업로드, 다운로드 에러와 세션 갱신 실패 에러가 같은 타입 안에 있어야 함

오히려 응집도가 떨어지는 상황이라고 판단해서 각 Manager 단위로 에러 타입을 따로 만듦

Screenshot 2025-01-09 at 2.37.52 PM.png

에러 핸들링 컨벤션

에러가 전파되는 과정에서 어떤 순서대로 에러가 전파되는지 확인할 필요가 있다고 생각함…

ex) MPC 통신 실패 → 인코딩/디코딩 에러 → 왜?

그래서 에러를 바인딩 해서 출력 해야할 것 같다.

do {
	try ...
	try ...
	try ...
} catch {
	SNMLogger.error(error.localizedDescription)
	throw 어쩌구...
}	

어떻게 에러 핸들링 해야 함?

에러를 발생시키는 케이스는 크게 두 가지로 구분 가능

  1. 유저에게 알려야 하는 에러 ex) 로그인 실패, MPC 통신 실패…
  2. 유저에게 알릴 필요가 없는 에러 ex) 세션 갱신 실패…

두 가지 케이스를 구분하기 위하여 SNMError로 최종적인 에러 레벨을 결정하는 방식 채용

struct SNMError: LocalizedError {
    enum ErrorLevel: String {
        case user = "유저"
        case developer = "개발자"
    }
    let level: ErrorLevel
    let error: any Error
    
    var errorDescription: String? {
        "\(level.rawValue) 레벨 에러 \(error.localizedDescription) 발생"
    }
}

모든 에러를 SNMError로 만들 필요는 없고, 최종적인 핸들링 작업이 들어가기 전에만 SNMError로 만들어주면 됨!

Clone this wiki locally