Правильне використання помилок


155

Я використовую TypeScript для досить великого проекту, і мені цікаво, що таке стандарт для використання Errors. Наприклад, скажіть, я передаю індекс поза межами меж виключенням на Java:

throw new IndexOutOfBoundsException();

Буде еквівалентним твердженням у TypeScript:

throw new Error("Index Out of Bounds");

Якими іншими способами я міг цього досягти? Який прийнятий стандарт?

Відповіді:


167

Хтось опублікував це посилання на MDN в коментарі, і я думаю, це було дуже корисно . Він дуже ретельно описує такі речі, як ErrorTypes.

EvalError --- Створює екземпляр, що представляє помилку, яка виникає щодо глобальної функції eval ().

InternalError --- Створює екземпляр, що представляє помилку, яка виникає при закиданні внутрішньої помилки в двигун JavaScript. Наприклад, "занадто багато рекурсії".

RangeError --- Створює екземпляр, що представляє помилку, яка виникає, коли числова змінна або параметр виходить за рамки допустимого діапазону.

ReferenceError --- Створює екземпляр, що представляє помилку, яка виникає під час відсилання недійсної посилання.

SyntaxError --- Створює екземпляр, що представляє помилку синтаксису, яка виникає під час розбору коду в eval ().

TypeError --- Створює екземпляр, що представляє помилку, яка виникає, коли змінна або параметр не є допустимим типом.

URIError --- Створює екземпляр, що представляє помилку, яка виникає, коли encodeURI () або decodeURI () передаються недійсними параметрами.


Здається, не вистачає більш загального типу для недійсного аргументу . Не всі недійсні аргументи підпадають RangeError. Чи слід визначити власні типи чи просто throw new Error("<message>");?
anddero

58

Використовується конвенція щодо поза діапазону в JavaScript RangeError. Щоб перевірити тип, використовуйте if / else +, instanceofпочинаючи з найбільш конкретного до найбільш загального

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}

2
А як щодо загальної помилки? І / або де список вбудованих у класи помилок JS?
pitosalas

7
У Мережі розробників Mozilla є список типів помилок JavaScript та інша інформація: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Крістіан Давен

6
@basarat Я думаю, вам слід додати else { throw; }тут
knocte

44

Просте рішення для передачі та показу повідомлення за допомогою винятку.

try {
  throw new TypeError("Error message");
}
catch (e){
  console.log((<Error>e).message);//conversion to Error type
}

Обережність

Вище не є рішенням, якщо ми не знаємо, яка помилка може бути видана з блоку. У таких випадках слід використовувати захисні типи та робити належну обробку для належної помилки - подивіться на відповідь @Moriarty.


Дякуємо за вказівник на явне перетворення типів. Не знайшов цієї інформації в Typescript-Docs і сьогодні щось дізнався.
JackLeEmmerdeur

чи знаєте ви, яка мета додавання <Error>? e.message добре працює для мене.
sbattou

1
@sbattou єдина мета <Error>- сказати компілятору TS, що eтут типи, <Error>щоб у вас було (1) intellisense та (2) краща перевірка типу. Будьте в курсі, що будь-який виступ взагалі не перекладається на JS і є суто синтаксичним цукром.
Дідій

25

Не забувайте про заяви переключення:

  • Забезпечте поводження з default.
  • instanceof може відповідати суперкласові.
  • ES6 constructorвідповідатиме точному класу.
  • Легше читати.

function handleError() {
    try {
        throw new RangeError();
    }
    catch (e) {
        switch (e.constructor) {
            case Error:      return console.log('generic');
            case RangeError: return console.log('range');
            default:         return console.log('unknown');
        }
    }
}

handleError();


3
Це чудово; здається більш надійним і чіткішим, ніж інші відповіді.
Віктор Заманян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.