JS에서 typeof 오류 확인
JS에서는 함수에 전달 된 인수가 실제로 'error'유형인지 또는 Error 인스턴스인지 확인할 수 없습니다.
예를 들어, 이것은 유효하지 않습니다 :
typeof err === 'error'
가능한 문자열 유형이 6 개뿐이므로 (문자열 형식) :
typeof 연산자는 유형 정보를 문자열로 반환합니다. typeof
반환되는 가능한 값은 6 가지입니다 .
"숫자", "문자열", "부울", "개체", "함수"및 "정의되지 않음".
그러나 다음과 같은 간단한 유스 케이스가 있다면 어떨까요?
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
'Programming' 카테고리의 다른 글
CFBundle CertUIFramework.axbundle에 대한 실행 파일을 찾을 수 없습니다 (0) | 2020.07.23 |
---|---|
이클립스에서 파일 검색 탭으로 직접 단축키를 만드는 방법 (0) | 2020.07.23 |
SQL에서 뷰와 테이블의 차이점 (0) | 2020.07.23 |
C # 4.0에서 메서드 오버로드 및 선택적 매개 변수 (0) | 2020.07.23 |
jQuery 및 AngularJS와 같은 JavaScript 라이브러리를 사용하여 UI를 구현할 수있는 경우 JSF의 필요성 (0) | 2020.07.23 |