URI.Error 예외

URI.Error 예외

URI를 다루다 보면 잘못된 형식의 URI가 들어왔을 때가 있어요. 이 예외는 URI가 유효하지 않을 때 발생하는 예외로, URI 파싱과 관련된 오류를 담아요. URI 모듈에서 유효하지 않은 URI를 처리할 때 던져지는 예외예요.

출처: URI.Error exception (Elixir v1.20.4)

본문

URI.Error는 URI가 유효하지 않을 때 오류가 발생한 경우 던져지는 예외예요.

예를 들어 URI.new!/1은 URI를 파싱하다가 오류가 나면 이 예외를 던져요. new!/1 끝의 느낌표(!)는 "실패하면 예외를 던진다"는 Elixir의 관례를 나타내요. 그래서 유효하지 않은 URI 문자열을 URI.new!/1에 넘기면 이 예외를 만나게 되죠.

반대로 URI.new/1처럼 느낌표가 없는 함수는 실패 시 예외 대신 {:ok, uri} 또는 {:error, reason} 같은 태그된 튜플을 반환해요. 어떤 방식을 쓸지는 상황에 따라 달라져요 — 실패 가능성이 낮고 즉시 중단해야 한다면 new!/1을, 실패를 값으로 처리해야 한다면 new/1을 사용하면 돼요.

이 예외는 URI 모듈의 파싱 기능을 사용할 때 특히 자주 마주쳐요. URI는 형식이 까다로워서, 문자열을 직접 조작하는 대신 URI 모듈의 함수로 검증하고 파싱하는 편이 안전해요.

일반적인 디버깅 흐름은 이렇게 진행돼요. 먼저 입력으로 들어온 문자열이 온전한 URI인지 확인하고, 만약 {:ok, uri}가 아니라 {:error, %URI.Error{...}}가 반환되거나 예외가 던져졌다면, 입력 문자열의 스킴(scheme), 호스트, 포트 등 각 구성 요소를 점검해요. 퍼센트 인코딩(percent-encoding)이 잘못된 경우도 흔한 원인이라서, URL에 한글이나 공백이 그대로 들어가지 않았는지도 살펴볼 필요가 있어요. URI.encode/2URI.decode/1 같은 함수로 인코딩을 정리해 준 뒤 다시 파싱을 시도하면 대부분 해결돼요.

이 예외의 또 다른 특징은, URI 모듈이 비공개로 다루는 예외라는 점이에요. 대부분의 경우 개발자가 직접 %URI.Error{}를 만들어 던질 일은 없고, URI 모듈이 내부적으로 만들어 던져요. 그래서 이 예외의 존재를 아는 것만으로도 충분해요 — 문제가 생기면 어떤 함수가 왜 이 예외를 던졌는지에 집중하면 돼요.

더 알아보기