Programming

JS에서 typeof 오류 확인

procodes 2020. 7. 23. 21:01
반응형

JS에서 typeof 오류 확인


JS에서는 함수에 전달 된 인수가 실제로 'error'유형인지 또는 Error 인스턴스인지 확인할 수 없습니다.

예를 들어, 이것은 유효하지 않습니다 :

typeof err === 'error'

가능한 문자열 유형이 6 개뿐이므로 (문자열 형식) :

typeof 연산자는 유형 정보를 문자열로 반환합니다. typeof반환되는 가능한 값은 6 가지입니다 .

"숫자", "문자열", "부울", "개체", "함수"및 "정의되지 않음".

MSDN

그러나 다음과 같은 간단한 유스 케이스가 있다면 어떨까요?

function errorHandler(err) {

    if (typeof err === 'error') {
        throw err;
    }
    else {
        console.error('Unexpectedly, no error was passed to error handler. But here is the message:',err);
    }
}

그렇다면 인수가 오류의 인스턴스인지 확인하는 가장 좋은 방법은 무엇입니까?

instanceof도움 운영자입니까?


instanceof연산자 를 사용할 수 있습니다 .

var myError = new Error('foo');
myError instanceof Error // true
var myString = "Whatever";
myString instanceof Error // false

확인이 수행되는 위치와 다른 창 / 프레임 / iframe에서 오류가 발생하면 작동하지 않습니다. 그러나 이것은 그렇지 않으면 간단하고 비교적 강력한 접근법입니다.


나는 원래 질문을했다-@Trott의 대답은 확실히 최고입니다.

그러나 JS가 동적 언어이고 많은 JS 런타임 환경이 있기 때문에 instanceof운영자는 특히 iframe과 같은 경계를 넘을 때 프론트 엔드 개발에서 실패 할 수 있습니다. 참조 : https://github.com/mrdoob/three.js/issues/5886

오리 타이핑에 문제가없는 경우 다음과 같이하십시오.

let isError = function(e){
 return e && e.stack && e.message;
}

저는 개인적으로 정적으로 유형이 지정된 언어를 선호하지만 동적 언어를 사용하는 경우 정적으로 유형이 지정된 언어처럼 동작하도록 강요하는 대신 동적 언어를 그대로 사용하는 것이 가장 좋습니다.

좀 더 정확하게 알고 싶다면 다음과 같이하십시오.

   let isError = function(e){
     return e && e.stack && e.message && typeof e.stack === 'string' 
            && typeof e.message === 'string';
    }

var myError = new Error('foo');
myError instanceof Error // true
var myString = "Whatever";
myString instanceof Error // false

이것의 유일한 문제는

myError instanceof Object // true

이에 대한 대안은 constructor 속성을 사용하는 것입니다.

myError.constructor === Object // false
myError.constructor === String // false
myError.constructor === Boolean // false
myError.constructor === Symbol // false
myError.constructor === Function // false
myError.constructor === Error // true

이 일치는 다음과 같이 매우 구체적입니다.

myError.constructor === TypeError // false

또는 다른 유형의 오류에 이것을 사용하십시오.

function isError(val) {
  return (!!val && typeof val === 'object')
    && ((Object.prototype.toString.call(val) === '[object Error]')
      || (typeof val.message === 'string' && typeof val.name === 'string'))
}

obj.constructor.name을 사용하여 객체의 "클래스"를 확인할 수 있습니다 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Function_names_in_classes

예를 들어

var error = new Error("ValidationError");
console.log(error.constructor.name);

위의 줄은 객체의 클래스 이름 인 "Error"를 기록합니다. 클래스가 "name"이라는 속성을 사용하지 않는 경우 자바 스크립트의 모든 클래스와 함께 사용할 수 있습니다.

참고 URL : https://stackoverflow.com/questions/30469261/checking-for-typeof-error-in-js

반응형