🔥 검증 후 오류 처리하기
ArgumentParser에서 ValidationError 타입은 특별한 오류입니다. 검증 오류 메시지는 항상 적절한 사용법 문자열과 함께 제공됩니다. validate() 또는 run() 메서드에서 다른 오류를 던져서 검증과 관련이 없는 문제가 발생했음을 나타낼 수 있습니다. CustomStringConvertible 또는 LocalizedError를 준수하는 오류는 사용자에게 가장 좋은 경험을 제공합니다.
다음은 LineCount 구조체의 예시 코드입니다:
struct LineCount: ParsableCommand { @Argument var file: String mutating func run() throws { // 지정된 파일의 내용을 UTF-8 인코딩으로 읽어옵니다. let contents = try String(contentsOfFile: file, encoding: .utf8) // 줄 바꿈 문자를 기준으로 내용을 분할합니다. let lines = contents.split(separator: "\n") // 줄 수를 출력합니다. print(lines.count) } }swift
사용자가 잘못된 파일을 지정하면 String(contentsOfFile:encoding:) 이니셜라이저가 실패합니다. ArgumentParser는 오류 메시지를 표준 오류로 출력하고 오류 코드와 함께 종료합니다.
% line-count file1.swift 37 % line-count non-existing-file.swift Error: The file "non-existing-file.swift" couldn't be opened because there is no such file.text
오류 출력을 직접 출력하는 경우에도 적절한 종료 코드로 명령이 종료되도록 validate() 또는 run()에서 오류를 던져야 합니다. 추가 오류 메시지 출력을 피하려면 성공, 실패 및 검증 오류에 대한 정적 속성이 있거나 특정 종료 코드를 지정할 수 있는 ExitCode 오류를 사용하면 됩니다.
다음은 RuntimeError 구조체와 Example 구조체의 예시 코드입니다:
struct RuntimeError: Error, CustomStringConvertible { var description: String } struct Example: ParsableCommand { @Argument var inputFile: String mutating func run() throws { // ExampleCore.processFile(_:) 메서드를 호출하여 파일 처리를 시도합니다. if !ExampleCore.processFile(inputFile) { // 파일 처리에 실패한 경우 ExampleCore.processFile(_:)이 자체 오류를 출력하고 false를 반환합니다. // 이 경우 ExitCode.failure 오류를 던져 명령을 종료합니다. throw ExitCode.failure } } }swift
위 예시에서는 ExampleCore.processFile(_:) 메서드가 자체적으로 오류를 출력하고 실패 시 false를 반환한다고 가정합니다. 파일 처리에 실패한 경우 ExitCode.failure 오류를 던져서 명령을 종료합니다.
이렇게 ValidationError를 사용하여 검증 관련 오류를 처리하고, 다른 오류 타입을 사용하여 검증 이외의 오류를 처리할 수 있습니다. 오류 메시지를 직접 출력하는 경우에도 적절한 종료 코드로 명령이 종료되도록 주의해야 합니다.