JS에서 오류 유형 확인
JS에서는 함수에 전달된 인수가 실제로 'error' 유형인지 또는 Error 인스턴스인지 확인할 수 없습니다.
예를 들어, 이것은 유효하지 않습니다.
typeof err === 'error'
가능한 타입은 6개뿐이므로(문자열 형식)
type of 연산자는 type 정보를 문자열로 반환합니다.다음과 같은 6가지 가능한 값이 있습니다.typeof
반환:
"number", "string", "control", "object", "function" 및 "function"이 있습니다.
하지만 다음과 같은 간단한 사용 사례가 있으면 어떻게 될까요?
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
도움이 필요하신가요?
연산자를 사용할 수 있습니다(단, 아래 경고 참조).
var myError = new Error('foo');
myError instanceof Error // true
var myString = "Whatever";
myString instanceof Error // false
위의 오류는 체크가 발생한 창/프레임/iframe이 아닌 다른 창/프레임/iframe에 느려지면 작동하지 않습니다.이 경우,instanceof Error
체크는 false를 반환한다.Error
물건.이 경우 가장 쉬운 방법은 오리 타이핑입니다.
if (myError && myError.stack && myError.message) {
// it's an error, probably
}
단, duck-typing은 오류 이외의 오브젝트가 포함된 경우 false positive를 생성할 수 있습니다.stack
그리고.message
특성.
나는 원래의 질문을 했다.- @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 = (e) => {
return e && e.stack && e.message && typeof e.stack === 'string'
&& typeof e.message === 'string';
}
를 사용하면 오브젝트가 다른 프레임에서도 동작하는 가 아닌지를 쉽게 확인할 수 있습니다.
function isError(obj){
return Object.prototype.toString.call(obj) === "[object Error]";
}
function isError(obj){
return Object.prototype.toString.call(obj) === "[object Error]";
}
console.log("Error:", isError(new Error));
console.log("RangeError:", isError(new RangeError));
console.log("SyntaxError:", isError(new SyntaxError));
console.log("Object:", isError({}));
console.log("Array:", isError([]));
이 동작은 ECMAScript Language Specification에 의해 보증됩니다.
다음과 같습니다Object.prototype.toString
.
toString 메서드가 호출되면 다음 절차가 수행됩니다.
- 이 값이 정의되지 않은 경우 [object Undefined]를 반환합니다.
- 이 값이 null이면 [object Null]을 반환합니다.
- O는 ToObject를 호출하여 이 값을 인수로 전달한 결과라고 합니다.
- class를 O의 [Class] 내부 속성 값으로 합니다.
- [ object " , class , " ] 세 개의 String을 연결한 결과 String 값을 반환합니다.
합니다.
[[Class]]
에러오류 인스턴스에는 특별한 속성이 없습니다.
var myError = new Error('foo');
myError instanceof Error // true
var myString = "Whatever";
myString instanceof Error // false
이것의 유일한 문제는
myError instanceof Object // true
이에 대한 대안은 생성자 속성을 사용하는 것입니다.
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
TypeScript 솔루션
사용자 정의 유형 가드를 정의할 수 있습니다. 반환 유형이 유형 술어인 함수를 정의하기만 하면 됩니다.
이렇게 변수가 오류인지 확인할 수 있습니다.
const isError = (err: unknown): err is Error => err instanceof Error;
그럼 안에서 캐치해봐 이렇게 인증해봐
try {
login(username, password);
} catch (err) {
if (isError(err)) {
console.log(err.message);
}
(저와 같이) '공식적인' 방법을 찾고 있는 고객에게 MDN은 다음과 같이 권장합니다.
try {
myRoutine();
} catch (e) {
if (e instanceof RangeError) {
// statements to handle this very common expected error
} else {
throw e; // re-throw the error unchanged
}
}
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"이라는 이름으로 된 속성을 사용하지 않는 경우 javascript의 모든 클래스와 함께 사용할 수 있습니다.
당신의 코드 @Trott에 감사드리며, 저는 단지 같은 코드를 사용했을 뿐이며, 다른 사람의 이익을 위해 실시간 작업 예를 추가했습니다.
<html>
<body >
<p>The **instanceof** operator returns true if the specified object is an instance of the specified object.</p>
<script>
var myError = new Error("TypeError: Cannot set property 'innerHTML' of null"); // error type when element is not defined
myError instanceof Error // true
function test(){
var v1 = document.getElementById("myid").innerHTML ="zunu"; // to change with this
try {
var v1 = document.getElementById("myidd").innerHTML ="zunu"; // exception caught
}
catch (e) {
if (e instanceof Error) {
console.error(e.name + ': ' + e.message) // error will be displayed at browser console
}
}
finally{
var v1 = document.getElementById("myid").innerHTML ="Text Changed to Zunu"; // finally innerHTML changed to this.
}
}
</script>
<p id="myid">This text will change</p>
<input type="button" onclick="test();">
</body>
</html>
또는 다른 유형의 오류에 사용합니다.
function isError(val) {
return (!!val && typeof val === 'object')
&& ((Object.prototype.toString.call(val) === '[object Error]')
|| (typeof val.message === 'string' && typeof val.name === 'string'))
}
를 사용합니다.error.name
function _err(type = false) {
if(type) {
throw new TypeError('Oh crap!')
}
throw new Error('Oh crap!')
}
try {
_err(true)
} catch (error) {
console.log(typeof error.name, error.name, error.name === 'TypeError')
}
try {
_err()
} catch (error) {
console.log(typeof error.name, error.name, error.name === 'Error')
}
@ 더 오브젝트의 @iota를 할 수 .[[Prototype]]
를 통한 getPrototypeOf()
권장되지 않는 「」를 참조해 주세요.__proto__
★★★★★★★★★★★★★★★★★★.
됩니다.Error.prototype
아마 이렇게 될 겁니다.
// the object you want to check
const objectToCheck = new Error();
// current way
console.log(Object.getPrototypeOf(objectToCheck) === Error.prototype); /* true*/
// deprecated way
console.log(objectToCheck.__proto__ === Error.prototype); /* true */
언급URL : https://stackoverflow.com/questions/30469261/checking-for-typeof-error-in-js
'programing' 카테고리의 다른 글
간단한 Getter/Setter 코멘트 (0) | 2022.09.27 |
---|---|
배열에서 매개 변수를 사용하여 URL 생성 (0) | 2022.09.20 |
클래스 JavaLaunchHelper는 양쪽에서 구현됩니다.둘 중 하나가 사용됩니다.정의되지 않은 것 (0) | 2022.09.20 |
도커 이미지의 mariadb에서 InnoDB 오류 발생 (0) | 2022.09.20 |
Yii 프레임워크에 CSS,javascript 파일 포함 (0) | 2022.09.20 |