JS의 사용자 정의 예외

오류 상황을 서로 구별하기 위해 사용자 정의 예외를 생성하는 것은 java 및 c#와 같은 매우 일반적인 언어입니다. JS에는 error 객체와 몇 가지 다른 유형이 있지만 매우 제한된 용도로 사용됩니다.

이러한 이유로 예외 유형을 생성할 가능성도 있습니다. 그들을 위한 타이핑이 있다는 것을 시뮬레이트하기 위해. 우리는 이것을 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...');
    
      }
    
    }
    

    좋은 웹페이지 즐겨찾기