때 우리는 무언가를 개발하는,우리는 종종 필요 우리 자신의 클래스는 오류를 반영 할 수있는 특정이 잘못에서 우리의 작업이 있습니다. 의 오류에 대한 네트워크는 작업이 필요할 수 있는HttpError
,를 위한 데이터베이스 작업에는DbError
,색에 대한 작업을NotFoundError
와.
우리의 오류를 지원해야 하는 기본적인 오류가 같은 속성을message
,name
고,바람직하게는stack
. 그러나 그들은 또한 자신의 다른 속성을 가질 수 있습니다, HttpError
체할 수 있는statusCode
속성 값은 다음과 같404
또는403
또는500
.
JavaScript 을 사용할 수 있습throw
으로 인수,그래서 기술적으로 우리 사용자 지정 오류를 수업 필요가 없는 상속에서Error
. 그러나 우리가 상속하면obj instanceof Error
를 사용하여 오류 개체를 식별 할 수있게됩니다. 그래서 그것으로부터 상속받는 것이 낫습니다.
응용 프로그램이 성장함에 따라 우리 자신의 오류는 자연스럽게 계층 구조를 형성합니다., 예를 들어HttpTimeoutError
는HttpError
등에서 상속받을 수 있습니다.
확장 오류
예를 들어 사용자 데이터로 JSON 을 읽어야하는 함수readUser(json)
를 고려해 보겠습니다.
여기는 방법은 유효한json
보일 수 있습니다:
let json = `{ "name": "John", "age": 30 }`;
,내부적으로는 우리가 사용하는JSON.parse
. 잘못된 형식의json
를 받으면SyntaxError
가 발생합니다., 그러나json
가 구문 적으로 정확하더라도 유효한 사용자임을 의미하지는 않습니다. 필요한 데이터를 놓칠 수 있습니다. 예를 들어,그것은 없을 수도 있습name
및age
속성을 위해 필수적인 사용해 주시기 바랍니다.
우리의 함수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
. 그리고instanceof
check 는 새로운 상속 클래스에 대해 계속 작동합니다. 그래서 그것은 미래 지향적 인 것입니다.
또한 그것의 중요한 경catch
을 충족하는 알 수 없는 오류를,그것은 rethrows 에서 선(**)
., catch
블록에서만 처리하는 방법을 알고 검증하고 구문 오류는,다른 종류(인하여 오타 코드에서 또는 알려지지 않은 다른 사람)를 통해 떨어질 수 있습니다.
추가 상속
ValidationError
클래스는 매우 일반적입니다. 많은 것들이 잘못 될 수도 있습니다. 속성이 없거나 잘못된 형식(예:age
의 문자열 값)일 수 있습니다. 더 구체적인 클래스PropertyRequiredError
를 정확히 결석 속성에 대해 만들어 보겠습니다. 그것은 누락 된 속성에 대한 추가 정보를 전달합니다.,
새로운 classPropertyRequiredError
는 사용하기 쉽고:우리는 전달해야 호텔 이름:new PropertyRequiredError(property)
. 사람이 읽을 수있는message
는 생성자에 의해 생성됩니다.
this.name
inPropertyRequiredError
생성자가 다시 수동으로 할당됩니다. 모든 사용자 정의 오류 클래스에서this.name = <class name>
를 할당하는 것이 약간 지루할 수 있습니다. 우리는this.name = this.constructor.name
를 할당하는 자체”기본 오류”클래스를 만들어 피할 수 있습니다. 그런 다음 모든 사용자 정의 오류를 상속받습니다.,나는 이것이 어떻게 작동하는지 잘 모르겠습니다.
여기에는 코드와 함께MyError
고 다른 사용자 지정 오류래,단순화:
이제 사용자 지정 오류를 훨씬 짧은,특히ValidationError
으로,우리는 우리의"this.name = ..."
라인에서 생성자입니다.
래핑 예외
위의 코드에서 함수readUser
의 목적은”사용자 데이터를 읽는 것”입니다. 프로세스에서 다른 종류의 오류가 발생할 수 있습니다., 지금 우리SyntaxError
및ValidationError
지만,향후에는readUser
기능을 수 있는 성장하고 아마 생성하는 다른 종류의 오류가 있습니다.
readUser
를 호출하는 코드는 이러한 오류를 처리해야합니다. 지금 그것을 사용하는 여러if
catch
블록을 확인하는 클래스와 손잡이 알려져 있는 오류 및를 다시 발생시키고,알 수 없는 것들입니다.위의 코드에서 두 가지 유형의 오류를 볼 수 있지만 더 많은 오류가있을 수 있습니다.,
경우에는readUser
기능을 생성하는 여러 종류의 오류를 다음,우리는 우리 자신에게 물어봐야 합니다:우리는 정말을 확인하려면 모든 유형에 오류가 하나에 의해 하나의 모든 시간은?
종종 대답은”아니오”입니다:우리는”그 모든 것 이상의 한 수준”이되고 싶습니다. 우리는 단지 알고 싶은 경우가 있었다”데이터를 읽기 오류”–정확히 왜 일어났는 종종 무관(오류 메시지에 그것을 설명). 또는 더 나은 점은 오류 세부 정보를 얻을 수있는 방법을 갖고 싶지만 필요한 경우에만 가능합니다.
여기서 설명하는 기술을”래핑 예외”라고합니다.,
- 일반적인”데이터 읽기”오류를 나타 내기 위해 새 클래스
ReadError
를 만들 것입니다. - 기능을
readUser
을 잡을 것입니다 데이터를 읽고 발생한 오류는 그 안에,같은ValidationError
및SyntaxError
,그리고 생성하는ReadError
대신 합니다. ReadError
개체를 유지 참조 원본에 오류가의cause
을 제공합니다.,
다음 코드를 호출하는readUser
것을 확인ReadError
,지 않는 모든 종류의 데이터를 읽기 오류가 있습니다. 그리고 오류에 대한 자세한 내용이 필요한 경우cause
속성을 확인할 수 있습니다.,
여기에는 코드는 정의ReadError
을 보여 줍니다 그것의 사용에서readUser
및try..catch
위 코드에서 readUser
작품이 정확히 설명된 대로–을 잡는 구문 및 유효성 검사 오류가 발생ReadError
오류를 대신(알 수 없는 오류를 다시 throw 평소와 같이).따라서 외부 코드는instanceof ReadError
를 확인합니다. 가능한 모든 오류 유형을 나열 할 필요가 없습니다.,
접근은”감싸는 예외”기 때문에,우리는”낮은 수준에”예외”랩”으로 그들을ReadError
더 추상적입니다. 그것은 객체 지향 프로그래밍에 널리 사용됩니다.
요약
Error
및 기타 내장 오류 클래스에서 일반적으로 상속 할 수 있습니다. 우리는 그냥 돌볼 필요가의name
속성하는 것을 잊지 마세 전화super
.instanceof
를 사용하여 특정 오류를 확인할 수 있습니다. 또한 상속과 함께 작동합니다., 그러나 때때로 우리는 오류체에서 나오는 제 3 자 라이브러리가 없을 얻을 수있는 쉬운 방법입니다. 그런 다음name
속성을 이러한 검사에 사용할 수 있습니다.- 포장 예외 광범위한 기술:기능 손잡이 낮은 수준의 예외하고 높은 수준의 오류에 대한 다양한 낮은 수준의 것들입니다. 낮은 수준에 예외가 되기도 해당 객체의 특성을 다음과 같
err.cause
위의 예에서,하지만 엄격히 필요합니다.리>