Что такое ошибка времени выполнения javascript

I understand what causes runtime errors. I want to understand how the browser behaves afterwards.

Will event handlers attached before the error still work?

If a script loaded async finishes after a runtime error will it be able to execute?

Basically, how catastrophic is a run-time error?

asked Apr 1, 2015 at 15:22

spinners's user avatar

2

An uncaught runtime error only stops the current execution, which may be

  • the execution of a script
  • the call of an event handler

Suppose you have a runtime error while handling an event, the only problem you might have (apart not really handling the event) is a non consistent state of your user variables if your event handler modifies some of them. Other event handlers won’t be impacted besides that.

So it can usually be considered as non catastrophic (I guess I don’t have to remember it’s a good practice to fix errors anyways and that flooding the console with errors isn’t a good thing).

Community's user avatar

answered Apr 1, 2015 at 15:30

Denys Séguret's user avatar

Denys SéguretDenys Séguret

370k85 gold badges775 silver badges752 bronze badges

You can use the try/catch/finally block. Using the catch block you can navigate inside the error and it will be running when a run-time error occurred or an illegal operation occurs. Visit this link, here is some more information about try/catch/finally http://www.javascriptkit.com/javatutors/trycatch.shtml

A run-time error can be catastrophic depends on where it happened and what does the piece of code when it occurs. In this way you can crash all the application or just stop some plugin.

Choxx's user avatar

Choxx

9351 gold badge24 silver badges46 bronze badges

answered Apr 1, 2015 at 16:04

gaperaltav's user avatar

Whenever a webpage is opened, all the scripts starts loading. If any of the scripts encounters any runtime error, then the execution of that script stops. That means any further statements in the scripts will not get executed by the browser. You can find these errors on the console window of the browser. However you can make use of try catch blocks to handle the exceptions occuring.
For example, consider the following script:

<script>
    var x=10, y=0;
    /*...............
    .................
    perform some other tasks here
    This will execute with no error
    .................
    ................*/
    var z=x/y; //here error occur
//below any statements will never execute.
{
    /*................
    ..................
    some operations
    this block will not execute because a runtime error occurs above.
    ..................
    ................*/
}
</script>

No any further statement after statement var z=x/y; will execute because a runtime error occured.

answered Apr 1, 2015 at 15:40

Choxx's user avatar

ChoxxChoxx

9351 gold badge24 silver badges46 bronze badges

1

В программировании есть три типа ошибок: (a) Ошибки синтаксиса, (b) Ошибки времени выполнения и (c) Логические ошибки.

Ошибки синтаксиса

Синтаксические ошибки, также называемые ошибками синтаксического анализа, происходят во время компиляции на традиционных языках программирования и во время интерпретации в JavaScript.

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

<script type="text/javascript">
   <!--
      window.print(;
   //-->
</script>

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

Ошибки времени выполнения

Ошибки выполнения, также называемые исключениями, возникают во время выполнения (после компиляции / интерпретации).

Например, следующая строка вызывает ошибку времени выполнения, поскольку здесь синтаксис верен, но во время выполнения он пытается вызвать метод, который не существует.

<script type="text/javascript">
   <!--
      window.printme();
   //-->
</script>

Исключения также влияют на поток, в котором они происходят, позволяя другим потокам JavaScript продолжать нормальное выполнение.

Логические ошибки

Логические ошибки могут быть наиболее сложным типом ошибок для отслеживания. Эти ошибки не являются результатом синтаксиса или ошибки времени выполнения. Вместо этого они возникают, когда вы ошибаетесь в логике, которая управляет вашим скриптом, и вы не получаете ожидаемого результата.

Вы не можете поймать эти ошибки, потому что это зависит от вашего бизнес-требования, какой тип логики вы хотите поместить в свою программу.

Try … catch … finally

В последних версиях JavaScript добавлены возможности обработки исключений. JavaScript реализует функцию try ... catch ... finally, а также оператор throw для обработки исключений.

Вы можете catch (поймать) генерируемые программой исключения времени выполнения , но вы не можете поймать ошибки синтаксиса JavaScript.

Try … catch … finally синтаксис блока —

<script type="text/javascript">
   <!--
      try {
         // Code to run
         [break;]
      }
     
      catch ( e ) {
         // Code to run if an exception occurs
         [break;]
      }
     
      [ finally {
         // Code that is always executed regardless of
         // an exception occurring
      }]
   //-->
</script>

За блоком try должен следовать либо один блок catch, либо один блок finally(или один из них). Когда в блоке try возникает исключение, исключение помещается в e и выполняется блок catch. Необязательный блок finally выполняется безоговорочно после try / catch.

Примеры

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

<html>
   <head>
     
      <script type="text/javascript">
         <!--
            function myFunc()
            {
               var a = 100;
               alert("Value of variable a is : " + a );
            }
         //-->
      </script>
     
   </head>
  
   <body>
      <p>Click the following to see the result:</p>
     
      <form>
         <input type="button" value="Click Me" onclick="myFunc();" />
      </form>
     
   </body>
</html>

Теперь попробуем поймать это исключение, используя try ... catch и отображаем удобное для пользователя сообщение. Вы также можете подавить это сообщение, если хотите скрыть эту ошибку от пользователя.

<html>
  
   <head>
     
      <script type="text/javascript">
         <!--
            function myFunc()
            {
               var a = 100;
               try {
                  alert("Value of variable a is : " + a );
               }
              
               catch ( e ) {
                  alert("Error: " + e.description );
               }
            }
         //-->
      </script>
     
   </head>
  
   <body>
      <p>Click the following to see the result:</p>
     
      <form>
         <input type="button" value="Click Me" onclick="myFunc();" />
      </form>
     
   </body>
</html>

Вы можете использовать finally (окончательный) блок, который всегда будет выполняться безоговорочно после try / catch. Вот пример.

<html>
  
   <head>
     
      <script type="text/javascript">
         <!--
            function myFunc()
            {
               var a = 100;
              
               try {
                  alert("Value of variable a is : " + a );
               }
              
               catch ( e ) {
                  alert("Error: " + e.description );
               }
              
               finally {
                  alert("Finally block will always execute!" );
               }
            }
         //-->
      </script>
     
   </head>
  
   <body>
      <p>Click the following to see the result:</p>
     
      <form>
         <input type="button" value="Click Me" onclick="myFunc();" />
      </form>
     
   </body>
</html>

Результат
The throw Statement

Вы можете использовать инструкцию throw для повышения своих встроенных исключений или ваших индивидуальных исключений. Позже эти исключения могут быть захвачены, и вы можете предпринять соответствующие действия.

пример

В следующем примере показано, как использовать оператор throw.

<html>
  
   <head>
     
      <script type="text/javascript">
         <!--
            function myFunc()
            {
               var a = 100;
               var b = 0;
              
               try{
                  if ( b == 0 ){
                     throw( "Divide by zero error." );
                  }
                 
                  else
                  {
                     var c = a / b;
                  }
               }
              
               catch ( e ) {
                  alert("Error: " + e );
               }
            }
         //-->
      </script>
     
   </head>
  
   <body>
      <p>Click the following to see the result:</p>
     
      <form>
         <input type="button" value="Click Me" onclick="myFunc();" />
      </form>
     
   </body>
</html>

Вы можете создать исключение в одной функции, используя строку, целое число, логическое значение или объект, а затем вы можете зафиксировать это исключение либо в той же функции, что и выше, либо в другой функции, используя блок try ... catch.

Метод onerror()

OnError обработчик событий, и это первый признак, чтобы облегчить обработку ошибок в JavaScript. Ошибка событие вызывается на объект окна всякий раз, когда происходит исключение на этой странице.

<html>
  
   <head>
     
      <script type="text/javascript">
         <!--
            window.onerror = function () {
               alert("An error occurred.");
            }
         //-->
      </script>
     
   </head>
  
   <body>
      <p>Click the following to see the result:</p>
     
      <form>
         <input type="button" value="Click Me" onclick="myFunc();" />
      </form>
     
   </body>
</html>

OnError обработчик событий содержит три части информации, чтобы определить точный характер ошибки —

  • Сообщение об ошибке — то же сообщение, отображаемое браузером для данной ошибки
  • URL — файл, в котором произошла ошибка
  • Номер строки — номер строки в указанном URL, который вызвал ошибку

Вот пример, чтобы показать, как извлечь эту информацию.

пример

<html>
   <head>
      <script type="text/javascript">
         <!--
            window.onerror = function (msg, url, line) {
               alert("Message : " + msg );
               alert("url : " + url );
               alert("Line number : " + line );
            }
         //-->
      </script>
   
   </head>
  
   <body>
      <p>Click the following to see the result:</p>
     
      <form>
         <input type="button" value="Click Me" onclick="myFunc();" />
      </form>
     
   </body>
</html>

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

<img src="/images/myimage.gif" onerror="alert('An error occurred loading the image.')" /> 

Вы можете использовать onerror со многими тегами HTML для отображения соответствующих сообщений в случае ошибок.

Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!

Существует ряд причин, по которым код JavaScript может вызывать ошибки, например:

  • Проблема с сетевым подключением;
  • Пользователь мог ввести неверное значение в поля формы;
  • Ссылка на объекты или функции, которые не существуют;
  • Неправильные данные отправляются или принимаются с веб-сервера;
  • Служба, к которой приложение должно получить доступ, может быть временно недоступна.

Эти типы ошибок известны как ошибки времени выполнения (runtime errors), поскольку они возникают во время выполнения скрипта. Профессиональное приложение должно иметь возможность корректно обрабатывать такие ошибки во время выполнения. Обычно это означает понятное информирование пользователя о возникшей проблеме.

Оператор try…catch

JavaScript предоставляет оператор try-catch, чтобы перехватывать ошибки времени выполнения и корректно их обработать.

Любой код, который может вызвать ошибку, должен быть помещен в блок оператора try, а код для обработки ошибки помещен в блок catch, как показано здесь:

try {
    // Код, который может вызвать ошибку
} catch(error) {
    // Действие, которое нужно выполнить при возникновении ошибки
}

Если ошибка возникает в любой точке блока try, выполнение кода немедленно переносится из блока try в блок catch. Если в блоке try ошибки не возникает, блок catch будет проигнорирован, и программа продолжит выполнение после оператора try-catch.

Следующий пример демонстрирует, как работает оператор try-catch:

try {
    var greet = "Hi, there!";
    document.write(greet);
    
    // Попытка получить доступ к несуществующей переменной
    document.write(welcome);
    
    // Если произошла ошибка, следующая строка не будет выполнена
    alert("All statements are executed successfully.");
} catch(error) {
    // Обработка ошибки
  alert("Caught error: " + error.message);
}
 
// Продолжаем исполнение кода
document.write("<p>Hello World!</p>");

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

Также обратите внимание, что за ключевым словом catch указывается идентификатор в скобках. Этот идентификатор действует как параметр функции. При возникновении ошибки интерпретатор JavaScript генерирует объект, содержащий сведения о нем. Этот объект ошибки затем передается в качестве аргумента для обработки.

Оператор try-catch является механизмом обработки исключений. Исключением является сигнал, который указывает, что во время выполнения программы возникли какие-то исключительные условия или ошибки. Термины «исключение» и «ошибка» часто используются взаимозаменяемо.

Оператор try…catch…finally

Оператор try-catch также может содержать предложение finally. Код внутри блока finally всегда будет выполняться независимо от того, произошла ошибка в блоке try или нет.

В следующем примере всегда отображается общее время, затраченное на выполнение кода.

// Присвоение значения, возвращаемого диалоговым окном
var num = prompt("Enter a positive integer between 0 to 100");

// Запоминание времени начала исполнения
var start = Date.now();

try {
    if(num > 0 && num <= 100) {
        alert(Math.pow(num, num)); // the base to the exponent power
    } else {
        throw new Error("An invalid value is entered!");
    }
} catch(e) {
    alert(e.message);
} finally {
    // Отображение времени, необходимого для выполнения кода
    alert("Execution took: " + (Date.now() - start) + "ms");
}

Вызов ошибок с помощью оператора throw

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

Общий синтаксис оператора throw: throw expression;

Выражение expression может быть объектом или значением любого типа данных. Однако лучше использовать объекты, желательно со свойствами name и message. Встроенный в JavaScript конструктор Error() предоставляет удобный способ создания объекта ошибки. Давайте посмотрим на некоторые примеры:

throw 123;
throw "Missing values!";
throw true;
throw { name: "InvalidParameter", message: "Parameter is not a number!" };
throw new Error("Something went wrong!");

Если вы используете встроенные в JavaScript функции конструктора ошибок (например, Error(), TypeError() и т. д.) для создания объектов ошибок, тогда свойство name совпадает с именем конструктора, а message равно аргументу функции конструктора.

Теперь мы собираемся создать функцию squareRoot(), чтобы найти квадратный корень числа. Это можно сделать просто с помощью встроенной в JavaScript функции Math.sqrt(), но проблема здесь в том, что она возвращает NaN для отрицательных чисел, не давая никаких подсказок о том, что пошло не так.

Мы собираемся исправить эту проблему, показывая пользователю ошибку, если указано отрицательное число.

function squareRoot(number) {
    // Выдает ошибку, если число отрицательное
    if(number < 0) {
        throw new Error("Sorry, can't calculate square root of a negative number.");
    } else {
        return Math.sqrt(number);
    }
}
    
try {
    squareRoot(16);
    squareRoot(625);
    squareRoot(-9);
    squareRoot(100);
    
    // Если выдается ошибка, следующая строка не будет выполнена
    alert("All calculations are performed successfully.");
} catch(e) {
    // Обработка ошибки
    alert(e.message);
}

Теоретически можно вычислить квадратный корень из отрицательного числа, используя мнимое число i, где i2 = -1. Следовательно, квадратный корень из -4 равен 2i, квадратный корень из -9 равен 3i и так далее. Но мнимые числа не поддерживаются в JavaScript.

Типы ошибок

Объект Error является базовым типом всех ошибок и имеет два основных свойства: name, указывающее тип ошибки и свойство message, которое содержит сообщение, описывающее ошибку более подробно. Любая выданная ошибка будет экземпляром объекта Error.

Существует несколько различных типов ошибок, которые могут возникнуть во время выполнения программы JavaScript, например RangeError, ReferenceError, SyntaxError, TypeError, и URIError.

В следующем разделе описывается каждый из этих типов ошибок более подробно:

RangeError

RangeError генерируется, когда вы используете число, выходящее за пределы допустимых значений. Например, создание массива с отрицательной длиной вызовет RangeError.

var num = 12.735;
num.toFixed(200); // выдает ошибку диапазона (допустимый диапазон от 0 до 100)

var array = new Array(-1); // выдает ошибку диапазона

ReferenceError

Ошибка ReferenceError обычно выдается, когда вы пытаетесь сослаться на переменную или объект, которые не существуют, или получить к ним доступ. В следующем примере показано, как происходит ошибка ReferenceError.

var firstName = "Harry";
console.log(firstname); // выдает ошибку ссылки (имена переменных чувствительны к регистру)

undefinedObj.getValues(); // выдает ошибку ссылки

nonexistentArray.length; // выдает ошибку ссылки

SyntaxError

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

var array = ["a", "b", "c"];
document.write(array.slice(2); // выдает синтаксическую ошибку (отсутствует скобка)

alert("Hello World!'); // выдает синтаксическую ошибку (несоответствие кавычек)

TypeError

Ошибка TypeError возникает, когда значение не относится к ожидаемому типу. Например, вызов метода строки для числа, вызов метода массива для строки и т. д.

var num = 123;
num.toLowerCase(); /* выдает ошибку (поскольку toLowerCase() является строковым методом, число не может быть преобразовано в нижний регистр) */

var greet = "Hello World!"
greet.join() // выдает ошибку (так как join() является методом массива)

URIError

URIError генерируется, когда вы указали недопустимый URI (расшифровывается как Uniform Resource Identifier) для функций, связанных с URI, таких как encodeURI() или decodeURI(), как показано здесь:

var a = "%E6%A2%B";
decodeURI(a);  // выдает ошибку URI

var b = "uD800";
encodeURI(b);   // выдает ошибку URI

Существует еще один тип ошибки EvalError, который генерируется при возникновении ошибки во время выполнения кода с помощью функции eval(). Хотя эта ошибка больше не генерируется JavaScript, этот объект все еще остается для обратной совместимости.

Конкретный тип ошибки также может быть выдан вручную с использованием соответствующего конструктора и оператора throw. Например, чтобы сгенерировать ошибку TypeError, вы можете использовать конструктор TypeError(), например:

var num = prompt("Please enter a number");

try {
    if(num != "" && num !== null && isFinite(+num)) {
        alert(Math.exp(num));
    } else {
        throw new TypeError("You have not entered a number.");
    }
} catch(e) {
    alert(e.name);
    alert(e.message);
    alert(e.stack); // нестандартное свойство
}

Объект Error также поддерживает некоторые нестандартные свойства. Одним из наиболее широко используемых таких свойств является: stack trace, который возвращает трассировку стека для этой ошибки. Вы можете использовать его в целях отладки, но не используйте его на рабочих сайтах.

Ошибки времени выполнения

Перейдем к ошибкам времени выполнения. После запуска кода на исполнение начинают появляться ошибки времени выполнения. Эти ошибки могут возникать в связи с множеством причин. Каждый из следующих далее блоков кода будет порождать ошибку:

alert(x); // 'x' не определено 

var x;

x[5] = 'test'; // 'x' будет null или не является объектом 


window.frames = 5; //  Не реализовано 


var for; // ожидается идентификатор 

document.doesNotExist(5);
// объект не поддерживает это свойство или метод 


alert(parseInt('5')); // ожидается объект

Многие из этих проблем вызываются более общими ошибками, которые приходится разыскивать.

  • Неправильное использование прописных букв

    Все встроенные функции JavaScript используют специальную форму записи имен функций, предполагающую, что имя функции начинается со строчной буквы, а в начале каждого следующего слова будет использоваться прописная буква: parseInt, getElementById, createElement, appendChild, и т.д.

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

  • Ссылка на несуществующий код, функции или объекты DOM

    Эта проблема возникает обычно в отношении объектов DOM. Предположим, что имеется код, который изменяет некоторые элементы формы на странице. Если делается попытка выполнить этот код до появления элементов формы, например, если поместить его в тег <HEAD>, то будет получена ошибка JavaScript.

    Обычно эта проблема легко решается. Лучшим решением будет выполнение кода по событию onload, например:

    <BODY onload="loadFunction();">

    или еще лучше, присоединение события к загрузке тела:

    document.captureEvents(Event.LOAD);
    document.onLoad=loadFunction;
  • Использование зарезервированного слова

    Существует длинный список зарезервированных ключевых слов JavaScript. Если делается попытка использовать многие из них вне их специального контекста, как, например, запись

    то будет возникать ошибка.

  • Использование пропущенного параметра

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

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

Однако последний тип ошибки из этого списка с пропущенными параметрами можно проверить достаточно легко:

function myFunction(a, b, c){
  if(a){
    // выполняется работа с a
  }
  if(b && c){
    // выполняется работа с b и c
  }
}

Если функция вызывается только с одной переменной, то проблемы не возникает. Однако надо помнить об одной вещи: если входящая по значению переменная может быть определена как false (0 или false ), то код не будет работать. В связи с этим лучше проверять, что переменная не была определена:

function myFunction(a, b, c){
  if(typeof(a)!='undefined'){
    // выполнение кода с a
  }
  if((typeof(b)!='undefined') && (typeof(c)!='undefined')){
    // выполнение кода с b и c
  }
}

В этом случае, даже если одна из переменных будет передана как 0, false или null, код все равно будет работать.

Сейчас мы перейдем к изучению механизмов обработок ошибок — с помощью операторов Try/Catch и функции window.onerror.

Error Объекты ошибок выбрасываются при возникновении ошибок времени выполнения. Объект Error также можно использовать в качестве базового объекта для пользовательских исключений. См. Ниже стандартные встроенные типы ошибок.

Description

Error types

Помимо общей Error конструктора, есть и другие конструкторы основной ошибки в JavaScript. Информацию об исключениях на стороне клиента см. В разделе Операторы обработки исключений .

EvalError

Создает экземпляр, представляющий ошибку, возникающую в отношении глобальной функции eval() .

RangeError

Создает экземпляр,представляющий ошибку,которая возникает,когда числовая переменная или параметр выходит за пределы допустимого диапазона.

ReferenceError

Создает экземпляр,представляющий собой ошибку,которая возникает при удалении недействительной ссылки.

SyntaxError

Создает экземпляр,представляющий синтаксическую ошибку.

TypeError

Создает экземпляр,представляющий собой ошибку,которая возникает,когда переменная или параметр не имеет допустимого типа.

URIError

Создает экземпляр, представляющий ошибку, которая возникает, когда encodeURI() или decodeURI() передаются недопустимые параметры.

AggregateError

Создает экземпляр, представляющий несколько ошибок, заключенных в одну ошибку, когда операция должна сообщить о нескольких ошибках, например с помощью Promise.any() .

InternalError Non-standard

Создает экземпляр,представляющий собой ошибку,которая возникает при выбросе внутренней ошибки в движке JavaScript.Например,»слишком большая рекурсия».

Constructor

Error()

Создает новый объект Error .

Static methods

Error.captureStackTrace() Non-standard

Нестандартная функция V8, которая создает свойство stack в экземпляре Error.

Error.stackTraceLimit Non-standard

Нестандартное числовое свойство V8,которое ограничивает количество кадров стека для включения в трассировку стека ошибок.

Error.prepareStackTrace() Non-standard Optional

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

Instance properties

Error.prototype.message

Сообщение об ошибке. Для созданных пользователем объектов Error это строка, предоставляемая в качестве первого аргумента конструктора.

Error.prototype.name

Имя ошибки.Оно определяется функцией конструктора.

Error.prototype.cause

Причина ошибки, указывающая причину, по которой возникает текущая ошибка — обычно это другая пойманная ошибка. Для созданных пользователем объектов Error это значение, указанное в качестве свойства cause второго аргумента конструктора.

Error.prototype.fileName Non-standard

Нестандартное свойство Mozilla для пути к файлу,вызвавшему эту ошибку.

Error.prototype.lineNumber Non-standard

Нестандартное свойство Mozilla для номера строки в файле,вызвавшем эту ошибку.

Error.prototype.columnNumber Non-standard

Нестандартное свойство Mozilla для номера столбца в строке,вызвавшей эту ошибку.

Error.prototype.stack Non-standard

Нестандартное свойство для трассировки стека.

Instance methods

Examples

Бросая общую ошибку

Обычно вы создаете объект Error с намерением поднять его с помощью ключевого слова throw . Вы можете обработать ошибку, используя конструкцию try...catch :

try {
  throw new Error('Whoops!');
} catch (e) {
  console.error(`${e.name}: ${e.message}`);
}

Обработка ошибок определенного типа

Вы можете выбрать обработку только определенных типов ошибок, проверив тип ошибки с помощью свойства constructor ошибки или, если вы пишете для современных движков JavaScript, ключевое слово instanceof :

try {
  foo.bar();
} catch (e) {
  if (e instanceof EvalError) {
    console.error(`${e.name}: ${e.message}`);
  } else if (e instanceof RangeError) {
    console.error(`${e.name}: ${e.message}`);
  }
  

  else {
    
    throw e;
  }
}

Различайте похожие ошибки

Иногда блок кода может не сработать по причинам,требующим разной обработки,но вызывающим очень похожие ошибки (т.е.с одинаковым типом и сообщением).

Если у вас нет контроля над исходными выдаваемыми ошибками, один из вариантов — их перехватить и выбросить новые объекты Error с более конкретными сообщениями. Исходная ошибка должна быть передана в новую Error в option параметра конструктора ( свойство cause ), так как это гарантирует, что исходная ошибка и трассировка стека будут доступны для блоков try / catch более высокого уровня.

В приведенном ниже примере показано это для двух методов, которые в противном случае потерпели бы неудачу с аналогичными ошибками ( doFailSomeWay() и doFailAnotherWay() ):

function doWork() {
  try {
    doFailSomeWay();
  } catch (err) {
    throw new Error('Failed in some way', { cause: err });
  }
  try {
    doFailAnotherWay();
  } catch (err) {
    throw new Error('Failed in another way', { cause: err });
  }
}

try {
  doWork();
} catch (err) {
  switch(err.message) {
    case 'Failed in some way':
      handleFailSomeWay(err.cause);
      break;
    case 'Failed in another way':
      handleFailAnotherWay(err.cause);
      break;
  }
}

Примечание. Если вы создаете библиотеку, вам лучше использовать причину ошибки, чтобы различать разные выдаваемые ошибки, а не просить ваших потребителей анализировать сообщение об ошибке. См . пример на странице причины ошибки .

Пользовательские типы ошибок также могут использовать свойство cause при условии, что конструктор подклассов передает параметр options при вызове super() :

class MyError extends Error {
  constructor() {
    
    super(message, options);
  }
}

Пользовательские типы ошибок

Возможно, вы захотите определить свои собственные типы ошибок, производные от Error , чтобы иметь возможность throw new MyError() и использовать instanceof MyError для проверки типа ошибки в обработчике исключений. Это приводит к более чистому и последовательному коду обработки ошибок.

См. «Какой хороший способ расширить Error в JavaScript?» на StackOverflow для подробного обсуждения.

Класс ES6 CustomError

Предупреждение. Версии Babel до 7 могут обрабатывать методы класса CustomError , но только если они объявлены с помощью Object.defineProperty () . В противном случае старые версии Babel и других транспилеров не будут правильно обрабатывать следующий код без дополнительной настройки .

Примечание. Некоторые браузеры включают конструктор CustomError в трассировку стека при использовании классов ES2015.

class CustomError extends Error {
  constructor(foo = 'bar', ...params) {
    
    super(...params);

    
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, CustomError);
    }

    this.name = 'CustomError';
    
    this.foo = foo;
    this.date = new Date();
  }
}

try {
  throw new CustomError('baz', 'bazMessage');
} catch (e) {
  console.error(e.name);    
  console.error(e.foo);     
  console.error(e.message); 
  console.error(e.stack);   
}

Объект ES5 CustomError

Предупреждение: все браузеры включают конструктор CustomError в трассировку стека при использовании объявления прототипа.

function CustomError(foo, message, fileName, lineNumber) {
  var instance = new Error(message, fileName, lineNumber);
  instance.foo = foo;
  Object.setPrototypeOf(instance, CustomError.prototype);
  if (Error.captureStackTrace) {
    Error.captureStackTrace(instance, CustomError);
  }
  return instance;
}

Object.setPrototypeOf(CustomError.prototype, Error.prototype);

Object.setPrototypeOf(CustomError, Error);

CustomError.prototype.name = 'CustomError';

try {
  throw new CustomError('baz', 'bazMessage');
} catch (e) {
  console.error(e.name); 
  console.error(e.foo); 
  console.error(e.message); 
}

Specifications

Browser compatibility

Desktop Mobile Server
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox для Android Opera Android Safari на IOS Samsung Internet Deno Node.js
Error

1

12

1

6

4

1

4.4

18

4

10.1

1

1.0

1.0

0.10.0

Error

1

12

1

6

4

1

4.4

18

4

10.1

1

1.0

1.0

0.10.0

cause

93

93

91

No

No

15

93

93

91

No

15

17.0

1.13

16.9.0

columnNumber

No

No

1

No

No

No

No

No

4

No

No

No

No

No

fileName

No

No

1

No

No

No

No

No

4

No

No

No

No

No

lineNumber

No

No

1

No

No

No

No

No

4

No

No

No

No

No

message

1

12

1

6

5

1

4.4

18

4

10.1

1

1.0

1.0

0.10.0

name

1

12

1

6

4

1

4.4

18

4

10.1

1

1.0

1.0

0.10.0

serializable_object

77

79

103

[«Версия 103 сериализует свойства: name , message , cause , fileName , lineNumber и columnNumber .», «Версия 104 дополнительно поддерживает сериализацию stack в window.postMessage() и StructuredClone( structuredClone() .»]

No

64

No

77

77

103

[«Версия 103 сериализует свойства: name , message , cause , fileName , lineNumber и columnNumber .», «Версия 104 дополнительно поддерживает сериализацию stack в window.postMessage() и StructuredClone( structuredClone() .»]

55

No

12.0

No

No

stack

3

12

1

10

10.5

6

≤37

18

4

11

6

1.0

1.0

0.10.0

toString

1

12

1

6

4

1

4.4

18

4

10.1

1

1.0

1.0

0.10.0

See also

  • Полифил Error с современным поведением, таким как cause поддержки , доступен в core-js .
  • throw
  • try...catch
  • Документация V8 для Error.captureStackTrace() , Error.stackTraceLimit и Error.prepareStackTrace() .


JavaScript

  • encodeURI()

    Функция encodeURI()кодирует a,заменяя каждый экземпляр определенных символов двумя,тремя или четырьмя управляющими последовательностями,представляющими кодировку UTF-8 (будет

  • encodeURIComponent()

    Функция encodeURIComponent()кодирует a,заменяя каждый экземпляр определенных символов двумя,тремя или четырьмя управляющими последовательностями,представляющими кодировку UTF-8

  • Error.prototype.cause

    Свойство cause указывает на конкретную причину ошибки.

  • Error.prototype.columnNumber

    Нестандартный:Эта функция не соответствует стандартам.

Возможно, вам также будет интересно:

  • Что такое ошибка воспроизведения потока
  • Что такое ошибка воспроизведения музыки
  • Что такое ошибка воспроизведения идентификатор воспроизведения в ютубе
  • Что такое ошибка воспроизведения аудио
  • Что такое ошибка воспроизведения 500

  • Понравилась статья? Поделить с друзьями:
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии