dr.Brain

doctor Brain

мир глазами веб-разработчика

Аргументы в сообщениях об ошибках

Как получить информацию о незаполненных аргументах в сообщениях об ошибках?

dr.Brain

время чтения 2 мин.

Photo by WeRoad on Unsplash

Вы когда-нибудь забывали указать необходимые аргументы функций в JavaScript и получали сообщение об ошибке? Не будем скрывать - это достаточно распространенная ситуация.

К сожалению, JavaScript явно не требует передачи параметров, объявленных в функциях, что приводит в перспективе к возможному появлению ошибок.

Например, создадим функцию, которая будет получать строку и возвращать ее только в том случае, когда строка содержит символ “G”:

function includesG(string) {
  return string.includes('G')
}

console.log(includesG('Gabriel')) // true

Мы видим, что функция работает превосходно. Но что случится, если мы вызовем функцию includesG() без аргумента?

function includesG(string) {
  return string.includes('G')
}

console.log(includesG())

Проверим с помощью Node:

$ node file.js
/home/gabrielrufino/Desktop/file.js:2
  return string.includes('G')
                ^

TypeError: Cannot read property 'includes' of undefined
    at includesG (/home/gabrielrufino/Desktop/lab/lab.js:2:17)
    at Object.<anonymous> (/home/gabrielrufino/Desktop/lab/lab.js:5:13)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47

Мы увидим достаточно серьезную ошибку.

Кажется, есть более удобный способ сообщить разработчику об отсутствии аргументов для функции. Давайте создадим понятное сообщение об ошибке.

Для начала создадим функцию isRequired(), которая будет идентифицировать появление ошибки:

function isRequired(argument) {
  throw new Error(`The argument ${argument} is required`)
}

function includesG(string) {
  return string.includes('G')
}

console.log(includesG())

Результатом выполнения функции isRequired() будет созданное нами пользовательское сообщение об ошибке с указанием пропущенного аргумента.

Такую функцию можно использовать, как параметр, заданный по умолчанию, для требуемого аргумента или аргументов:

function isRequired(argument) {
  throw new Error(`The argument ${argument} is required`)
}

function includesG(string = isRequired('string')) {
  return string.includes('G')
}

console.log(includesG())

Теперь, в случае, когда мы забудем передать аргумент, функция примет значение по умолчанию, которое является настраиваемым сообщением об ошибке.

Запустим код:

$ node file.js
/home/gabrielrufino/Desktop/file.js:2
  throw new Error(`The argument ${argument} is required`)
  ^

Error: The argument string is required
    at isRequired (/home/gabrielrufino/Desktop/lab/lab.js:2:9)
    at includesG (/home/gabrielrufino/Desktop/lab/lab.js:5:29)
    at Object.<anonymous> (/home/gabrielrufino/Desktop/lab/lab.js:9:13)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    at internal/main/run_main_module.js:17:47

Теперь мы получим в первой строки более понятное сообщение о пропущенном аргументе и его типе.

Зачем это нужно? Наверное потому, что сообщения об ошибках должны помогать разработчику, сообщая, что именно сделано не так.


Спасибо за внимание.


Написано по материалам статьи Gabriel Rufino “A creative way to have required arguments in JavaScript”.

Новые публикации

Далее

Категории

О нас

Frontend & Backend. Статьи, обзоры, заметки, код, уроки.