Welcome to Our Website

사용자 지정 오류를 확장,오류가

때 우리는 무언가를 개발하는,우리는 종종 필요 우리 자신의 클래스는 오류를 반영 할 수있는 특정이 잘못에서 우리의 작업이 있습니다. 의 오류에 대한 네트워크는 작업이 필요할 수 있는HttpError,를 위한 데이터베이스 작업에는DbError,색에 대한 작업을NotFoundError와.

우리의 오류를 지원해야 하는 기본적인 오류가 같은 속성을message,name고,바람직하게는stack. 그러나 그들은 또한 자신의 다른 속성을 가질 수 있습니다, HttpError체할 수 있는statusCode속성 값은 다음과 같404또는403또는500.

JavaScript 을 사용할 수 있습throw으로 인수,그래서 기술적으로 우리 사용자 지정 오류를 수업 필요가 없는 상속에서Error. 그러나 우리가 상속하면obj instanceof Error를 사용하여 오류 개체를 식별 할 수있게됩니다. 그래서 그것으로부터 상속받는 것이 낫습니다.

응용 프로그램이 성장함에 따라 우리 자신의 오류는 자연스럽게 계층 구조를 형성합니다., 예를 들어HttpTimeoutErrorHttpError등에서 상속받을 수 있습니다.

확장 오류

예를 들어 사용자 데이터로 JSON 을 읽어야하는 함수readUser(json)를 고려해 보겠습니다.

여기는 방법은 유효한json보일 수 있습니다:

let json = `{ "name": "John", "age": 30 }`;

,내부적으로는 우리가 사용하는JSON.parse. 잘못된 형식의json를 받으면SyntaxError가 발생합니다., 그러나json가 구문 적으로 정확하더라도 유효한 사용자임을 의미하지는 않습니다. 필요한 데이터를 놓칠 수 있습니다. 예를 들어,그것은 없을 수도 있습nameage속성을 위해 필수적인 사용해 주시기 바랍니다.

우리의 함수readUser(json)는 JSON 을 읽을뿐만 아니라 데이터를 확인(“유효성 검사”)합니다. 필수 필드가 없거나 형식이 잘못된 경우 오류입니다. 데이터가 구문 적으로 정확하지만 다른 종류의 오류이기 때문에SyntaxError가 아닙니다., 우리는 그것을ValidationError라고 부르며 그것을위한 클래스를 만들 것입니다. 그런 종류의 오류는 또한 문제가되는 필드에 대한 정보를 전달해야합니다.

우리의ValidationError클래스는 내장 된Error클래스에서 상속해야합니다.

는 클래스가 내장,하지만 여기에 그것의 대략적인 코드 그래서 우리는 이해할 수 있는 우리가 늘:

지금의ValidationError에서 그것을 시도에서 동작:

참고:선(1)우리는 부모가 생성자입니다., JavaScript 는 자식 생성자에서super를 호출해야하므로 의무 사항입니다. 부모 생성자는message속성을 설정합니다.

부모가 생성자를 설정한name속성을"Error"에서,그래서 라인(2)우리는 그것을 다시 설정이 올바른 값을.,

의 사용하려고 그것에서readUser(json)

try..catch블록에서 위의 코드를 처리 모두 우리의ValidationError내장SyntaxError에서는JSON.parse.

에서 봐 주시기 바랍니다 어떻게 우리가 사용하는instanceof에 대한 확인은 특정 오류를 입력 라인에서(*).,

우리는 또한 보err.name은 다음과 같습니다.

// ...// instead of (err instanceof SyntaxError)} else if (err.name == "SyntaxError") { // (*)// ...

instanceof버전은,더 나은 기 때문에 미래에 우리는 것을 확장하는ValidationError이,하위처럼,그것PropertyRequiredError. 그리고instanceofcheck 는 새로운 상속 클래스에 대해 계속 작동합니다. 그래서 그것은 미래 지향적 인 것입니다.

또한 그것의 중요한 경catch을 충족하는 알 수 없는 오류를,그것은 rethrows 에서 선(**)., catch블록에서만 처리하는 방법을 알고 검증하고 구문 오류는,다른 종류(인하여 오타 코드에서 또는 알려지지 않은 다른 사람)를 통해 떨어질 수 있습니다.

추가 상속

ValidationError클래스는 매우 일반적입니다. 많은 것들이 잘못 될 수도 있습니다. 속성이 없거나 잘못된 형식(예:age의 문자열 값)일 수 있습니다. 더 구체적인 클래스PropertyRequiredError를 정확히 결석 속성에 대해 만들어 보겠습니다. 그것은 누락 된 속성에 대한 추가 정보를 전달합니다.,

새로운 classPropertyRequiredError는 사용하기 쉽고:우리는 전달해야 호텔 이름:new PropertyRequiredError(property). 사람이 읽을 수있는message는 생성자에 의해 생성됩니다.

this.nameinPropertyRequiredError생성자가 다시 수동으로 할당됩니다. 모든 사용자 정의 오류 클래스에서this.name = <class name>를 할당하는 것이 약간 지루할 수 있습니다. 우리는this.name = this.constructor.name를 할당하는 자체”기본 오류”클래스를 만들어 피할 수 있습니다. 그런 다음 모든 사용자 정의 오류를 상속받습니다.,나는 이것이 어떻게 작동하는지 잘 모르겠습니다.

여기에는 코드와 함께MyError고 다른 사용자 지정 오류래,단순화:

이제 사용자 지정 오류를 훨씬 짧은,특히ValidationError으로,우리는 우리의"this.name = ..."라인에서 생성자입니다.

래핑 예외

위의 코드에서 함수readUser의 목적은”사용자 데이터를 읽는 것”입니다. 프로세스에서 다른 종류의 오류가 발생할 수 있습니다., 지금 우리SyntaxErrorValidationError지만,향후에는readUser기능을 수 있는 성장하고 아마 생성하는 다른 종류의 오류가 있습니다.

readUser를 호출하는 코드는 이러한 오류를 처리해야합니다. 지금 그것을 사용하는 여러ifcatch블록을 확인하는 클래스와 손잡이 알려져 있는 오류 및를 다시 발생시키고,알 수 없는 것들입니다.위의 코드에서 두 가지 유형의 오류를 볼 수 있지만 더 많은 오류가있을 수 있습니다.,

경우에는readUser기능을 생성하는 여러 종류의 오류를 다음,우리는 우리 자신에게 물어봐야 합니다:우리는 정말을 확인하려면 모든 유형에 오류가 하나에 의해 하나의 모든 시간은?

종종 대답은”아니오”입니다:우리는”그 모든 것 이상의 한 수준”이되고 싶습니다. 우리는 단지 알고 싶은 경우가 있었다”데이터를 읽기 오류”–정확히 왜 일어났는 종종 무관(오류 메시지에 그것을 설명). 또는 더 나은 점은 오류 세부 정보를 얻을 수있는 방법을 갖고 싶지만 필요한 경우에만 가능합니다.

여기서 설명하는 기술을”래핑 예외”라고합니다.,

  1. 일반적인”데이터 읽기”오류를 나타 내기 위해 새 클래스ReadError를 만들 것입니다.
  2. 기능을readUser을 잡을 것입니다 데이터를 읽고 발생한 오류는 그 안에,같은ValidationErrorSyntaxError,그리고 생성하는ReadError대신 합니다.
  3. ReadError개체를 유지 참조 원본에 오류가의cause을 제공합니다.,

다음 코드를 호출하는readUser것을 확인ReadError,지 않는 모든 종류의 데이터를 읽기 오류가 있습니다. 그리고 오류에 대한 자세한 내용이 필요한 경우cause속성을 확인할 수 있습니다.,

여기에는 코드는 정의ReadError을 보여 줍니다 그것의 사용에서readUsertry..catch

위 코드에서 readUser작품이 정확히 설명된 대로–을 잡는 구문 및 유효성 검사 오류가 발생ReadError오류를 대신(알 수 없는 오류를 다시 throw 평소와 같이).따라서 외부 코드는instanceof ReadError를 확인합니다. 가능한 모든 오류 유형을 나열 할 필요가 없습니다.,

접근은”감싸는 예외”기 때문에,우리는”낮은 수준에”예외”랩”으로 그들을ReadError더 추상적입니다. 그것은 객체 지향 프로그래밍에 널리 사용됩니다.

요약

  • Error및 기타 내장 오류 클래스에서 일반적으로 상속 할 수 있습니다. 우리는 그냥 돌볼 필요가의name속성하는 것을 잊지 마세 전화super.
  • instanceof를 사용하여 특정 오류를 확인할 수 있습니다. 또한 상속과 함께 작동합니다., 그러나 때때로 우리는 오류체에서 나오는 제 3 자 라이브러리가 없을 얻을 수있는 쉬운 방법입니다. 그런 다음name속성을 이러한 검사에 사용할 수 있습니다.
  • 포장 예외 광범위한 기술:기능 손잡이 낮은 수준의 예외하고 높은 수준의 오류에 대한 다양한 낮은 수준의 것들입니다. 낮은 수준에 예외가 되기도 해당 객체의 특성을 다음과 같err.cause위의 예에서,하지만 엄격히 필요합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다