Использование инварианта Facebook против броска

javascript error-handling invariants

4351 просмотра

1 ответ

Я просматривал исходные тексты различных проектов Node.js и заметил, что некоторые люди используют инварианты . Из того, что я понял, invariantэто инструмент, который позволяет вам вставлять утверждения в ваш код и выявлять ошибки по мере необходимости.

Вопрос:

Когда вы предпочли бы использовать invariantпротив бросать ошибки традиционным способом?

// Using invariant
function doSomething(a, b) {
   invariant(a > b, 'A should be greater than B');
}

// If throw
function doSomething(a, b) {
   if(a <= b) {
      throw new Error('A should be greater than B');
   }
}
Автор: rodrigo-silveira Источник Размещён: 08.11.2019 11:25

Ответы (1)


25 плюса

Решение

Есть несколько причин:

  • Это легче читать, когда вы хотите сложить их. Если у вас есть, скажем, 3 предварительных условия для проверки, вы всегда видите invariant(x ..., и легко увидеть, что проверяется:

function f(xs, x) {
    // all the invariants are lined up, one after another
    invariant(xs.type == x.type, "adding an element with the same type");
    invariant(xs.length != LIST_MAX_SIZE, "the list isn't full");
    invariant(fitting(x), "x is fitting right in the list");
}

Сравните с обычным броском:

function f(xs, x) {
    if (xs.type != x.type)
       throw new Error("adding an element with the same type");
    if (xs.length == LIST_MAX_SIZE)
       throw new Error("the list isn't full");
    if (!fitting(x))
       throw new Error("x is fitting right in the list");
}

  • Это позволяет легко устранить его в сборке релиза.

    Часто вы хотите, чтобы предварительные условия проверялись в dev / test, но не хотите, чтобы они были выпущены из-за их медленной работы. Если у вас есть такая invariantфункция, вы можете использовать такой инструмент, как babel (или какой-либо другой), чтобы удалить эти вызовы из производственных сборок (это немного похоже на то, как это делает D).

Автор: Ven Размещён: 20.08.2016 02:35
Вопросы из категории :
32x32