8

파서가 포함 된 작은 Node.js 패키지를 개발 중입니다. 회복 불가능한 문제점을 감지하자마자 발생합니다.던진 객체에서 오류 이유를 전달/최신 JavaScript에서 오류를 처리하는 방법

나는 꽤 오랫동안 자바를 사용해 왔으며 많은 예외 클래스에 익숙합니다.

하지만 JavaScript입니다. 나는 그것이 스타일의 문제라고 생각한다. 내 중요한 문제는 오류 이유를 catch 블록에 전달하는 방법입니다. 각각의 문제에 대한 세부 사항을 다루는 각각의 오류 이유에 대해 다른 오류 "클래스"를 만들거나 그 이유를 속성으로 유지하는 단일 오류 클래스를 작성하려고 생각했습니다.

catch(e) { 
    if(e instanceof FirstError) { 
    ... 
    } 
    if(e instanceof SecondError) { 
    ... 
    } 
} 

catch(err) { 
    if(err instanceof AnError) { 
    if(err.detail === 'becauseOfA') { 
     ... 
    } 
    if(err.detail === 'becauseOfB') { 
     ... 
    } 
    } 
    ... 
} 

접근 방법의 더 나은 :

은 내가 당신에게 오류의 두 가지 처리의 예를 들어 보자? 둘 다 잘될 것입니다. 그러나 나는 처음을 좋아하지 않습니다. 많은 수업이 저에게는 엄청난 오버 헤드가있는 것처럼 보입니다.

편집 : 콜백을 사용에 동의
은 (또한 here 대답) :

// One class per error type 
function(err, ast) { 
    if(err) { 
    if(err instanceof FirstError) { 
     ... 
    } 
    if(err instanceof SecondError) { 
     ... 
    } 
    } 
    ... 
} 

// One class for all errors 
function(err, ast) { 
    if(err) { 
    if(err instanceof AnError) { 
     if(err.detail === 'becauseOfA') { 
     ... 
     } 
     if(err.detail === 'becauseOfB') { 
     ... 
     } 
    } 
    ... 
    } 
} 

// No class at all 
function(err, ast) { 
    if(err) { 
    if(err.detail === 'becauseOfA') { 
     ... 
    } 
    if(err.detail === 'becauseOfB') { 
     ... 
    } 
    ... 
    } 
} 

문제가 지속 : 나는 모든 클래스를 삭제하고 프로토 타입 상속하지 않고 간단한 객체를 사용해야합니까? 오류 처리기 (catch 또는 callback 여부)에 문제에 대한 정보를 전달해야합니다.

작고 빠르기 때문에이 함수를 동기시키고 싶습니다 (예, 콜백이 비동기 함수가되지 않는다는 것을 알고 있습니다). AFAIK Node.js 자체는 비동기 함수 (fs.readFile)의 콜백에 오류 객체를 전달하면서 동기 코드 (fs.readFileSync)에 오류를 발생시킵니다.

+0

'==='를 사용하는 경우 +1. Javascript에서'try'-'catch'es를 사용하지는 않지만 첫 번째 버전을 선호합니다. 케이스의 경우 – Kninnug

+0

+1. 또한 js에서 가장 좋은 접근 방식이 무엇인지 궁금합니다. – lukaleli

+0

자바에서 왔을 때, 많은 클래스를 사용하는 것을 꺼려한다는 사실에 놀랐습니다. :) 그러나 실제로 그렇게 오래되었습니다 :'var ExceptionTypeA = function() {};'? – RandomSeed

답변

1

노드에 대한 최선의 방법은 모듈을 콜백 스타일로 다시 작성하는 것입니다. 콜백에 두 개의 인수를 전달해야하지만 첫 번째는 error 또는 null (작업이 성공적으로 완료되면)이고 두 번째는 작업 결과입니다 (또는 오류가 발생하면 null 또는 undefined).

콜백에서 처리하기 만하면됩니다. 오류를 문자열로 전달한 다음 여러 가지 상황을 처리하기 위해 대소 문자 (오류)를 전달할 수 있습니다.

UPD : 당신이 사용할 수 동기화 방법에 대한

던졌습니다,하지만 당신은 그들을 전환 그럼 그냥 문자열을 던질 수 있습니다. (예를 들어, 메소드가 다른 클래스에서 설명 될 수있는 Java 코드에서 매우 다른 오류를 발생시킬 수있는 경우) 다음과 같이 오브젝트 모양을 사용할 수 있습니다. {error : 'error_name', type : 'error_type '}.

다음 스위치 (err.type), 스위치 (err.error).

자바 스크립트에서이 클래스를 사용하는 것이 가장 좋은 방법은 아닙니다. 프로토 타입 속성을 사용하여 객체를 생성하고 생성자 객체를 가리키며 instaceof가 해당 포인터를 비교하기 때문입니다.

+0

감사합니다! 그래서 모든 오류 클래스를 삭제하고 콜백에 문제를 전달하겠습니까? node.js 자체가 콜백에 Error 객체 (오류 인스턴스)를 전달하지 않습니까? 이것이 비동기 함수가 아닌 최상의 접근 방법입니까? –

관련 문제