API 작업을 하다 보면 숫자만 입력받아야 하는 상황들이 있다. 문자열에 대해서 입력을 받으면 안 되는 상황들에서 예외처리를 어떻게 해야 하는지 알아보자.
1. 처리 1
cnt = parmas[:cnt].to_i
- cnt == 0
- ''
- '0'
- 'string'
- 즉, 공백, 0, 문자열을 모두 0으로 처리해준다. 그래서 정확한 예외처리를 해줄 수 없다.
2. 처리 2
def count
cnt = params[:cnt]
cnt_list = params[:cnt].bytes
raise ApiExceptions::CustomException.new(:status, 'error message')) if cnt.to_i == 0 && cnt_list.size > 0 && (cnt_list.map { |v| v < 48 || v > 57 }).include?(ture)
rescue => e
render_error e.class == ApiExceptions::CustomException ? e.msg : e.message
end
- 이렇게 처리해주면 문자열에 대해서 확실하게 처리해줄 수 있다.
- 먼저 bytes 메서드는 string을 아스키코드 값 리스트로 리턴해준다.
- 이렇게 해야 정확한 이유는 0과 '0'은 다르기 떄문이다.
- cnt.to_i == 0 인 경우가 예외 처리할 대상이다.
- cnt_list.size > 0 인 경우만 처리한 이유는 공백은 허용해주기 위함이다.
- map 함수는 안에 있는 v 값이 list의 원소를 의미하고 처리한 내용의 리턴 값을 그 타입으로 한다.
- 즉 위에서는 boolean값이 리턴 값이 되겠다.
- true가 있는 경우, 즉, string이 하나라도 존재하면 예외처리를 하게 하였다.
- 여기서 CustomException은 StandardError class를 상속받아서 예외처리를 간편하게 해 주기 위함이다.
module ApiExceptions
class CustomException < StandardError
attr_reader :status, :msg
def initialize(status, msg)
@status = status
@msg = msg
end
end
end
'Ruby On Rails > 예외처리' 카테고리의 다른 글
| Controller 예외처리 (0) | 2021.12.17 |
|---|