다른 유형의 오류를 어떻게 구현하여 특정 오류를 포착하고 다른 오류가 발생하도록 할 수 있습니다 ..?
이를 달성하는 한 가지 방법은 Error
객체 의 프로토 타입을 수정하는 것입니다 .
Error.prototype.sender = "";
function throwSpecificError()
{
var e = new Error();
e.sender = "specific";
throw e;
}
특정 오류 포착 :
try
{
throwSpecificError();
}
catch (e)
{
if (e.sender !== "specific") throw e;
// handle specific error
}
대안이 있습니까?
답변
사용자 지정 예외를 만들려면 Error 개체에서 상속 할 수 있습니다.
function SpecificError () {
}
SpecificError.prototype = new Error();
// ...
try {
throw new SpecificError;
} catch (e) {
if (e instanceof SpecificError) {
// specific error
} else {
throw e; // let others bubble up
}
}
오류에서 상속하지 않는 최소한의 접근 방식은 이름과 메시지 속성이있는 간단한 개체를 던질 수 있습니다.
function throwSpecificError() {
throw {
name: 'SpecificError',
message: 'SpecificError occurred!'
};
}
// ...
try {
throwSpecificError();
} catch (e) {
if (e.name == 'SpecificError') {
// specific error
} else {
throw e; // let others bubble up
}
}
답변
아래 주석에서 언급했듯이 이것은 Mozilla에만 해당되지만 ‘조건부 catch’블록을 사용할 수 있습니다. 예 :
try {
...
throwSpecificError();
...
}
catch (e if e.sender === "specific") {
specificHandler(e);
}
catch (e if e.sender === "unspecific") {
unspecificHandler(e);
}
catch (e) {
// don't know what to do
throw e;
}
이것은 적어도 구문 적으로 Java에서 사용되는 형식화 된 예외 처리와 더 유사한 것을 제공합니다.
답변
try-catch-finally.js
사용 시도 – 캐치 finally.js을 , 당신은 호출 할 수 _try
는 호출 익명의 콜백과 기능을, 그리고 당신은 체인 수 .catch
호출은 특정 오류를 잡으려고하고, .finally
호출은 어느 쪽이든을 실행합니다.
예
_try(function () {
throw 'My error';
})
.catch(Error, function (e) {
console.log('Caught Error: ' + e);
})
.catch(String, function (e) {
console.log('Caught String: ' + e);
})
.catch(function (e) {
console.log('Caught other: ' + e);
})
.finally(function () {
console.log('Error was caught explicitly');
});
현대적인 화살표 함수와 템플릿 리터럴을 사용한 예
_try(() => {
throw 'My error';
}).catch(Error, e => {
console.log(`Caught Error: ${e}`);
}).catch(String, e => {
console.log(`Caught String: ${e}`);
}).catch(e => {
console.log(`Caught other: ${e}`);
}).finally(() => {
console.log('Error was caught explicitly');
});
답변
수출용 모듈
/**
* Custom InputError
*/
class InputError extends Error {
/**
* Create InputError
* @param {String} message
*/
constructor(message) {
super(message);
this.name = this.constructor.name;
Error.captureStackTrace(this, this.constructor);
}
}
/**
* Custom AuthError
*/
class AuthError extends Error {
/**
* Create AuthError
* @param {String} message
*/
constructor(message) {
super(message);
this.name = this.constructor.name;
Error.captureStackTrace(this, this.constructor);
}
}
/**
* Custom NotFoundError
*/
class NotFoundError extends Error {
/**
* Create NotFoundError
* @param {String} message
*/
constructor(message) {
super(message);
this.name = this.constructor.name;
Error.captureStackTrace(this, this.constructor);
}
}
module.exports = {
InputError: InputError,
AuthError: AuthError,
NotFoundError: NotFoundError
};
스크립트로 가져 오기 :
const {InputError, AuthError, NotFoundError} = require(path.join(process.cwd(), 'lib', 'errors'));
사용하다:
function doTheCheck = () =>
checkInputData().then(() => {
return Promise.resolve();
}).catch(err => {
return Promise.reject(new InputError(err));
});
};
외부 호출 코드 :
doTheCheck.then(() => {
res.send('Ok');
}).catch(err => {
if (err instanceof NotFoundError) {
res.status(404).send('Not found');
} else if (err instanceof AuthError) {
res.status(301).send('Not allowed');
} else if (err instanceof InputError) {
res.status(400).send('Input invalid');
} else {
console.error(err.toString());
res.status(500).send('Server error');
}
});
답변
나는 이러한 솔루션을 좋아하지 않아서 직접 만들었습니다. try-catch-finally.js는 시도하기 전에 작은 밑줄 (_) 하나를 잊어 버린 경우 코드가 여전히 잘 실행되지만 아무것도 잡히지 않는다는 점을 제외하면 매우 멋집니다! 왝.
CatchFilter
내 코드에 CatchFilter를 추가했습니다.
"use strict";
/**
* This catches a specific error. If the error doesn't match the errorType class passed in, it is rethrown for a
* different catch handler to handle.
* @param errorType The class that should be caught
* @param funcToCall The function to call if an error is thrown of this type
* @return {Function} A function that can be given directly to the `.catch()` part of a promise.
*/
module.exports.catchOnly = function(errorType, funcToCall) {
return (error) => {
if(error instanceof errorType) {
return funcToCall(error);
} else {
// Oops, it's not for us.
throw error;
}
};
};
이제 필터링 할 수 있습니다.
이제 C # 또는 Java와 같이 필터링 할 수 있습니다.
new Promise((resolve, reject => {
<snip><snip>
}).catch(CatchFilter.catchOnly(MyError, err =>
console.log("This is for my error");
}).catch(err => {
console.log("This is for all of the other errors.");
});
답변
<li>
<span>onWarning:</span>
<span id="msg_warning"></span>
</li>
try {
// load face detection model
await changeFaceDetector(MTCNN)
changeInputSize(128)
// try to access users webcam and stream the images
// to the video element
const stream = await navigator.mediaDevices.getUserMedia({ video: {} })
const videoEl = $('#inputVideo').get(0)
videoEl.srcObject = stream
}
catch(err) {
//$("#msg_error").html(`Requested device not found`);
$("#msg_error").html(err.message);
console.log(err.message);
}
답변
