JS의 사용자 정의 예외
22535 단어 exceptionsjavascripterrorscode
이러한 이유로 예외 유형을 생성할 가능성도 있습니다. 그들을 위한 타이핑이 있다는 것을 시뮬레이트하기 위해. 우리는 이것을 100% OOP 또는 기능적인 방식으로 할 수 있습니다.
클래스 사용:
이 경우 JS의 OOP 클래스를 사용하여 프로그램에 대한 사용자 정의 예외를 만들 수 있습니다.
데모 코드
class ValidationError extends Error {
constructor(message) {
super(message)
this.name = 'VALIDATION_ERROR'
this.message = message
}
}
class PermissionError extends Error {
constructor(message) {
super(message)
this.name = 'PERMISSION_ERROR'
this.message = message
}
}
class ExecutionError extends Error {
constructor(message) {
super(message)
this.name = 'EXECUTION_ERROR'
this.message = message
}
}
module.exports = {
ValidationError,
PermissionError,
DatabaseError
}
사용 방법?
function myThrow(input) {
if (!input)
throw new ExecutionError('A execution error');
return input
}
기능 사용:
함수형 프로그래밍 스타일을 사용하여 사용자 정의 예외를 만들 수 있습니다.
데모 코드
const ValidationError = (message)=>({
error: new Error(message),
code: 'VALIDATION_ERROR'
});
const PermissionError = (message)=>({
error: new Error(message),
code: 'PERMISSION_ERROR'
});
const ExecutionError = (message)=>({
error: new Error(message),
code: 'EXECUTION_ERROR'
});
예시
const {
ValidationError,
PermissionError,
DatabaseError
} = require('./exceptions.js');
function myThrow(input) {
if (!input)
throw ExecutionError('A execution error');
return input
}
예외 메소드 확장:
"오류 개체 직렬화", 나중에 생성자를 사용할 수 있도록 함수를 사용합니다.
//Define exceptions.
function MyError(message){
const internal = {
error: new Error(message),
code: 'MY_CUSTOM_ERROR'
};
return {
...internal,
toJSON:()=>({
code: internal.code,
stack: internal.error.stack,
message
})
}
}
MyError.prototype = Object.create(Error.prototype);
예시:
//Launch
throw new MyError('So bad configuration');
//Capturing.
try{
//.....
throw new MyError('So bad configuration');
//.....
} catch(err){
console.log('Error',err.toJSON());
}
실생활의 예:
이전 예제를 읽었으면 이제 우리가 만들 수 있는 예외의 실제 예제를 찾을 때입니다. 나는 과거 프로젝트에서 사용한 몇 가지를 제안할 것입니다.
HTTP 오류 코드
//Definif exceptions.
const BadRequest = ()=>({
message: 'Bad Request',
code:400
});
const Unauthorized = ()=>({
message: 'Unauthorized',
code:401
});
const NotFound = ()=>({
message: 'Not Found',
code: 404
});
const InternalServerError = ()=>({
message: 'Internal Server Error',
code: 500
});
const BadGateWay = ()=>({
message: 'Bad Gateway',
code: 502
});
//Define exceptions map.
const exceptionMap = {
502: BadGateway,
500: InternalServerError,
404: NotFound,
401: Unauthorized,
400: BadRequest
};
//Using it.
const getUser = async(userId)=>{
//Make request, this line is just an example, use a real rest client.
const response = await fetch('http://user.mock/'+userId);
//Get httpcode.
const {
status,
body
} = response;
//Get the exception.
const exception = exceptionMap[status];
if (!exception)
throw exception();
else
return body;
}
사업 운영
//We have this custom exceptions
const LoanRejected = (motive, clientId)=>({
message: 'The loan was rejected',
code:'LOAN_REJECTED',
motive,
clientId
});
const LoanExced = (clientId)=>({
message: 'The loan ammount exced the limits',
code:'LOAN_EXCED',
clientId
});
const LoanPending = ()=>({
message: 'The client has a loan pending for payment',
code:'LOAN_PENDING'
});
//I simulate a loan process.
const processate = async(clientId,ammount)=>{
const status = await getLoanStatus(clientId,ammount);
//Detect status to reject the loan.
if (status.code=='REJECTED')
throw LoanRejected('Status not ready to calc',clienId);
if (status.code=='UNAVAILABLE')
throw LoanRejected('Clien banned',clienId);
if (status.code=='EXCED')
throw LoanExced();
//If the client has debts.
if (status.code=='PENDING')
throw LoanPending();
const loanId = await createLoan(clientId);
return loanId;
}
//And we detect the type of exceptions.
const loanFlow = async (clientId,ammount)=>{
try{
const loanId = procesate(clientId,ammount);
console.log('New loan create',loanId);
} catch(err){
if (err.code.includes['LOAN_REJECTED','LOAN_EXCED','LOAN_PENDING'])
console.log('Loan rejected!!');
else
console.log('Problem in process try again later...');
}
}
Reference
이 문제에 관하여(JS의 사용자 정의 예외), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/damxipo/custom-exceptions-with-js-3aoc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)