@timonck

Как создать свои ошибки в JS?

У меня есть класс поинт мне нужно создать для него исключения.Исключения будут появляться если в его аргументы приходят не числа и если приходит не 2 а больше или меньше аргументов.
class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }
}


Мой вариант но он работает не корректно.
function isNum(num){
    if(typeof num.x !== Number || typeof num.y !== Number ){
        throw  new Error('point is not a number ')
    }
    console.log('isnm')
}

let exampleNum = new Point(1,1);
console.log(exampleNum)

try{
    isNum(exampleNum)
}catch(e){
    console.log("Something went wrong")
    console.error(e)
}


Подскажите как написать правильно исключение?
  • Вопрос задан
  • 489 просмотров
Решения вопроса 3
wagoodoogoo
@wagoodoogoo
prestashop, webix, phalcon, vue, slim, craft cms
class Point {
          constructor(x, y) {
              this.x = x;
              this.y = y;
          }

          isNum()
          {
              if(typeof this.x !== 'number' || typeof this.y !== 'number' ) {
                  throw new Error('point is not a number ')
              }
          }
      }


      try{
            let exampleNum = new Point(1,2)
            exampleNum.isNum()
          } catch(e){          
          console.error(e)
      }
Ответ написан
@f_ban
Не совсем понял, когда проверка выполняется, если в конструкторе, то воспользуйтесь деструктуризацией аргументов, и делайте проверки до инициализации свойств объекта - это как минимум наглядно покажет все ограничения на входные параметры конструктора.
class Point {
  constructor(x, y, ...other) {
      if(other.length > 0){
        throw 'Only 2 number arguments';
      }
      if(typeof x !== 'number'){
        throw TypeError(`The first argument must be number but have got ${typeof x}`);
      }
      if(typeof y !== 'number'){
        throw TypeError(`The second argument must be number but have got ${typeof y}`);
      }
      
      this.x = x;
      this.y = y;
  }
}


Да, в JS можно написать throw 'Текст ошибки'; И это создаст вполне себе нормальный объект исключения класса Error. Также существуют разные стандартные классы исключений. Если требуется кастомный типизированый класс исключения, то просто унаследуйте новый класс от Error и используйте его в кострукции throw.

На самом деле, не совсем понимаю, зачем проверку свойств объекта выделили в отдельный метод. Это нужно дл какой-то валидации вне конструктора?
Ответ написан
like-a-boss
@like-a-boss
Признайся,тебяТянетНаКодМужика,ты—программный гей
function isNum(num) {
    if (typeof num.x !== 'number' || typeof num.y !== 'number' ) {
        throw  new Error('point is not a number ');
    }
    console.log('isnm');
}

let exampleNum = new Point(1,1);

try {
    isNum(exampleNum);
} catch(e) {
    console.error(e);
}


А вообще это говно-код. Рассказать почему? Код должен быть само-документируемым. Функция по объявлению принимает число, но постойте-ка, что я вижу: в действительности я должен передавать ей целый объект из экс, игрик, а не число. Я не должен смотреть внутрь isNum, чтобы понять, что в неё передавать. Раз она названа таким образом то она должна проверять: число ли аргумент. Либо переименовать аргумент и задокументировать эту микро-функцию. Но поскольку такая очевидная функция нуждается в документировании, значит с ней что-то не так.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы