Содержание

vue.js — обработка try…catch не правильно работает

Задать вопрос

Вопрос задан

Изменён 3 месяца назад

Просмотрен 48 раз

Начала пет-проект на nuxt. С axios не могу разобраться.

внутри methods

    async login() {
          try {
            const data = await this.$store.dispatch('login', { email: this.email.toLowerCase(), password: this.password})
            this.$router.push('/admin/user')
          } catch (e) {
            console.log('>>', e)
          }
        }

внутри actions, метод login

    async login({ commit }, user) {
        try {
          const resp = await this.$axios.$post('api/login/', user)
          commit('setToken', true)
          console.
log('resp') } catch (e) { console.log('error', e.response) return(e) } }

При правильном вводе данных приходит такая ошибка error ReferenceError: axios is not defined.

  • vue.js
  • axios
  • nuxt.js
  • try-catch

2

по шагам это в nuxt.config.js:

Шаг 1 — проверяем что добавлен в модуль

 modules: [
  '@nuxtjs/axios'
]

Шаг 2 — добавляем если нужны настройки

axios: {}

далее на странице: внимание на этот момент — передаем контекст

asyncData({$axios})

Шаг 3 — добавляем

async asyncData({$axios}) {
try {
  const test = await $axios.$get('https://jsonplaceholder.typicode.com/posts/1')
  console.log(test)
}
catch (e){
  console.log(e)
}
}

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Попробовать.

.. Поймать… Оператор Finally — Visual Basic
  • Статья
  • Чтение занимает 11 мин

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

Синтаксис

Try
    [ tryStatements ]
    [ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
    [ catchStatements ]
    [ Exit Try ] ]
[ Catch ... ]
[ Finally
    [ finallyStatements ] ]
End Try

Компоненты

ТерминОпределение
tryStatementsНеобязательный элемент. Операторы, в которых может возникнуть ошибка. Может быть составным оператором.
CatchНеобязательный элемент. Разрешено несколько
Catch
блоков. Если при обработке Try блока возникает исключение, каждый Catch оператор проверяется в текстовом порядке, чтобы определить, обрабатывает ли он исключение, exception представляющее созданное исключение.
exceptionНеобязательный элемент. Любое имя переменной. Начальное значение exception — это значение возникшей ошибки. Используется с Catch для указания перехвата ошибки. Если этот параметр опущен Catch , инструкция перехватывает любое исключение.
typeНеобязательный элемент. Указывает тип фильтра класса. Если значение
exception
имеет тип, заданный параметром type , или производного типа, идентификатор привязывается к объекту исключения.
WhenНеобязательный элемент. Оператор Catch с предложением When перехватывает исключения только в том случаеTrue, если expression имеет значение . Предложение When применяется только после проверки типа исключения и expression может ссылаться на идентификатор, представляющий исключение.
expressionНеобязательный элемент. Должен быть неявно преобразован в
Boolean
. Любое выражение, описывающее универсальный фильтр. Обычно используется для фильтрации по номеру ошибки. Используется с When ключевым словом для указания обстоятельств, при которых происходит перехват ошибки.
catchStatementsНеобязательный элемент. Операторы для обработки ошибок, возникающих в связанном Try блоке. Может быть составным оператором.
Exit TryНеобязательный элемент.
Ключевое слово, которое выходит из Try...Catch...Finally структуры. Выполнение возобновляется с кодом сразу после End Try оператора . Оператор Finally по-прежнему будет выполняться. Не допускается в Finally блоках.
FinallyНеобязательный элемент. Блок Finally всегда выполняется, когда выполнение покидает любую часть инструкции Try...Catch .
finallyStatementsНеобязательный элемент. Операторы, которые выполняются после обработки всех других ошибок.
End TryЗавершает структуру Try...Catch...Finally
.

Если предполагается, что определенное исключение может возникнуть во время определенного раздела кода, поместите код в блок и используйте Catch блок для сохранения элемента управления и обработки исключения в Try случае возникновения.

Оператор Try…Catch состоит из блока, Try за которым следует одно или несколько Catch предложений, которые указывают обработчики для различных исключений. При возникновении исключения в блоке Try Visual Basic ищет инструкцию Catch , обрабатывающую исключение. Если соответствующий Catch

оператор не найден, Visual Basic проверяет метод, который вызвал текущий метод, и т. д. в стеке вызовов. Если блок не Catch найден, Visual Basic отображает пользователю необработанное сообщение об исключении и останавливает выполнение программы.

В операторе можно использовать несколько Catch операторов Try…Catch . В этом случае порядок предложений имеет важное Catch значение, так как они проверяются по порядку. Перехватывайте более конкретные исключения перед менее конкретными.

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

Обычно следует использовать один из этих вариантов в качестве последнего Catch блока в Try...Catch...Finally структуре после перехвата всех ожидаемых исключений. Поток управления никогда не может достичь Catch блока, следующего за любой из этих вариантов.

  • Имеет type значение Exception, например: Catch ex As Exception

  • Оператор не exception имеет переменной, например: Catch

Try…Catch…Finally Когда оператор вложен в другой Try блок, Visual Basic сначала проверяет каждую Catch инструкцию во внутреннем блоке

Try. Если соответствующий Catch оператор не найден, поиск переходит к Catch операторам внешнего Try…Catch…Finally блока.

Локальные переменные из Try блока недоступны в блоке Catch , так как они являются отдельными блоками. Если вы хотите использовать переменную в нескольких блоках, объявите переменную вне Try...Catch...Finally структуры.

Совет

Оператор Try…Catch…Finally доступен в виде фрагмента кода IntelliSense. В диспетчере фрагментов кода разверните узел Code Patterns — If, For Each, Try Catch, Property и т. д., а затем — Обработка ошибок (исключения). Дополнительные сведения см. в статье Фрагменты кода.

Наконец, блок

Если у вас есть одна или несколько инструкций, которые необходимо выполнить перед выходом Finally из Try структуры, используйте блок . Управление передается блоку Finally непосредственно перед тем, как он выходит из Try…Catch структуры. Это верно, даже если исключение возникает в Try любом месте структуры.

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

Код в блоке Finally выполняется, даже если код встречает инструкцию Return в блоке Try или Catch . Элемент управления не передается из Try блока или Catch в соответствующий Finally блок в следующих случаях:

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

Try Если инструкция не содержит хотя бы один Catch блок, он должен содержать Finally блок .

Совет

Если не требуется перехватывать определенные исключения, Using инструкция ведет себя как Try…Finally блок и гарантирует удаление ресурсов независимо от способа выхода из блока. Это верно даже с необработанным исключением. Дополнительные сведения см. в разделе Оператор using.

Аргумент исключения

Аргумент Catch блока exception является экземпляром Exception класса или классом, производным от Exception класса . Экземпляр Exception класса соответствует ошибке, которая произошла в блоке Try .

Свойства Exception объекта помогают определить причину и расположение исключения. Например, свойство StackTrace перечисляет вызываемые методы, которые привели к исключению, помогая найти, где произошла ошибка в коде. Message возвращает сообщение, описывающее исключение. HelpLink возвращает ссылку на связанный файл справки. InnerExceptionException возвращает объект , вызвавшего текущее исключение, или возвращает Nothing , если исходный Exceptionобъект отсутствует .

Try…Catch Используйте оператор только для того, чтобы сообщить о возникновении необычных или непредвиденных программных событий. Это может быть вызвано следующими причинами.

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

  • Catch Если блок обрабатывается неправильно, исключение может быть неправильно передано пользователям.

  • Обработка исключений усложняет программу.

Не всегда требуется Try…Catch оператор для проверки на наличие условия, которое может возникнуть. В следующем примере проверяется, существует ли файл, прежде чем пытаться открыть его. Это уменьшает необходимость перехвата исключения, вызванного методом OpenText .

Private Sub TextFileExample(ByVal filePath As String)
    ' Verify that the file exists.
    If System.IO.File.Exists(filePath) = False Then
        Console.Write("File Not Found: " & filePath)
    Else
        ' Open the text file and display its contents.
        Dim sr As System.IO.StreamReader =
            System.IO.File.OpenText(filePath)
        Console.Write(sr.ReadToEnd)
        sr.Close()
    End If
End Sub

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

Асинхронные методы

Если пометить метод модификатором Async , можно использовать оператор Await в методе . Оператор с оператором Await приостанавливает выполнение метода до завершения ожидаемой задачи. Задача представляет выполняющуюся работу. Когда задача, связанная с оператором Await , завершается, выполнение возобновляется в том же методе. Дополнительные сведения см. в разделе Поток управления в асинхронных программах.

Задача, возвращаемая асинхронным методом, может завершиться в состоянии сбоя, указывая на то, что она завершена из-за необработанного исключения. Задача также может завершиться в состоянии отмены, что приводит к выброшению OperationCanceledException из выражения await. Чтобы перехватить исключение любого типа, поместите Await выражение, связанное с задачей Try , в блок и перехватите исключение в блоке Catch . Пример приведен далее в этом разделе.

Задача может находиться в состоянии сбоя, так как за ее сбой отвечало несколько исключений. Например, задача может быть результатом вызова метода Task.WhenAll. Когда вы ожидаете такую задачу, перехватимое исключение является только одним из исключений, и вы не можете предсказать, какое исключение будет перехвачено. Пример приведен далее в этом разделе.

Выражение Await не может находиться внутри Catch блока или Finally блока.

Iterators

Функция или метод доступа итератора выполняет пользовательскую итерацию Get по коллекции. Итератор использует оператор Yield для возврата каждого элемента коллекции по одному. Вы вызываете функцию итератора с помощью for each… Следующая инструкция.

Оператор Yield может находиться внутри Try блока. Блок Try , содержащий инструкцию Yield , может иметь Catch блоки и Finally блок . Пример см. в разделе «Попробовать блоки в Visual Basic» статьи Итераторы .

Оператор Yield не может находиться внутри Catch блока или Finally блока.

Если текст For Each (за пределами функции итератора) вызывает исключение, Catch блок в функции итератора не выполняется, но Finally выполняется блок в функции итератора. Блок Catch внутри функции итератора перехватывает только исключения, возникающие внутри функции итератора.

Ситуации частичного доверия

В ситуациях с частичным доверием, таких как приложение, размещенное в общей сетевой папке, не перехватывает исключения безопасности, Try...Catch...Finally возникающие до вызова метода, содержащего вызов. В следующем примере, когда вы помещаете его в общую папку сервера и запускаете его оттуда, возникает ошибка «System.Security.SecurityException: Request Failed». Дополнительные сведения об исключениях безопасности см. в SecurityException классе .

Try
    Process. Start("http://www.microsoft.com")
Catch ex As Exception
    Console.WriteLine("Can't load Web page" & vbCrLf & ex.Message)
End Try

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

Примеры

Структура try… Поймать… Наконец

В следующем примере показана Try...Catch...Finally структура оператора .

Public Sub TryExample()
    ' Declare variables.
    Dim x As Integer = 5
    Dim y As Integer = 0
    ' Set up structured error handling.
    Try
        ' Cause a "Divide by Zero" exception.
        x = x \ y
        ' This statement does not execute because program
        ' control passes to the Catch block when the
        ' exception occurs. 
        Console.WriteLine("end of Try block")
    Catch ex As Exception
        ' Show the exception's message.
        Console.WriteLine(ex.Message)
        ' Show the stack trace, which is a list of methods
        ' that are currently executing.
        Console.WriteLine("Stack Trace: " & vbCrLf & ex.StackTrace)
    Finally
        ' This line executes whether or not the exception occurs.
        Console.WriteLine("in Finally block")
    End Try
End Sub

Исключение в методе, вызываемом из блока Try

В следующем примере CreateException метод создает исключение NullReferenceException. Код, создающий исключение, не находится в блоке Try . CreateException Поэтому метод не обрабатывает исключение. Метод RunSample обрабатывает исключение, так как вызов CreateException метода находится в блоке Try .

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

Public Sub RunSample()
    Try
        CreateException()
    Catch ex As System.IO.IOException
        ' Code that reacts to IOException.
    Catch ex As NullReferenceException
        Console.WriteLine("NullReferenceException: " & ex.Message)
        Console.WriteLine("Stack Trace: " & vbCrLf & ex.StackTrace)
    Catch ex As Exception
        ' Code that reacts to any other exception.
    End Try
End Sub
Private Sub CreateException()
    ' This code throws a NullReferenceException.
    Dim obj = Nothing
    Dim prop = obj.Name
    ' This code also throws a NullReferenceException.
    'Throw New NullReferenceException("Something happened.")
End Sub

Оператор Catch When

В следующем примере показано, как использовать Catch When оператор для фильтрации по условному выражению. Если условное выражение имеет Trueзначение , код в блоке Catch выполняется.

Private Sub WhenExample()
    Dim i As Integer = 5
    Try
        Throw New ArgumentException()
    Catch e As OverflowException When i = 5
        Console. WriteLine("First handler")
    Catch e As ArgumentException When i = 4
        Console.WriteLine("Second handler")
    Catch When i = 5
        Console.WriteLine("Third handler")
    End Try
End Sub
' Output: Third handler

Вложенные инструкции Try

В следующем примере имеется Try…Catch оператор , содержащийся в блоке Try . Внутренний Catch блок создает исключение, свойство которого InnerException имеет исходное исключение. Внешний Catch блок сообщает о собственном исключении и внутреннем исключении.

Private Sub InnerExceptionExample()
    Try
        Try
            ' Set a reference to a StringBuilder.
            ' The exception below does not occur if the commented
            ' out statement is used instead.
            Dim sb As System.Text.StringBuilder
            'Dim sb As New System.Text.StringBuilder
            ' Cause a NullReferenceException.
            sb. Append("text")
        Catch ex As Exception
            ' Throw a new exception that has the inner exception
            ' set to the original exception.
            Throw New ApplicationException("Something happened :(", ex)
        End Try
    Catch ex2 As Exception
        ' Show the exception.
        Console.WriteLine("Exception: " & ex2.Message)
        Console.WriteLine(ex2.StackTrace)
        ' Show the inner exception, if one is present.
        If ex2.InnerException IsNot Nothing Then
            Console.WriteLine("Inner Exception: " & ex2.InnerException.Message)
            Console.WriteLine(ex2.StackTrace)
        End If
    End Try
End Sub

Обработка исключений для асинхронных методов

В следующем примере демонстрируется обработка исключений для асинхронных методов. Чтобы перехватить исключение, применимое к асинхронной задаче, Await выражение находится в Try блоке вызывающего объекта, а исключение перехватывается в блоке Catch .

Раскомментируйте строку Throw New Exception в этом примере для демонстрации обработки исключений. Исключение перехватится в блоке Catch , свойству задачи IsFaulted присваивается значение True, а свойству задачи Exception.InnerException присваивается исключение.

Раскомментируйте строку Throw New OperationCancelledException, чтобы показать, что происходит при отмене асинхронного процесса. Исключение перехватится в блоке Catch , а свойству задачи IsCanceled присваивается значение True. Однако при некоторых условиях, которые не относятся к этому примеру, для параметра задано значение True , IsFaulted а IsCanceled для — значение False.

Public Async Function DoSomethingAsync() As Task
    Dim theTask As Task(Of String) = DelayAsync()
    Try
        Dim result As String = Await theTask
        Debug.WriteLine("Result: " & result)
    Catch ex As Exception
        Debug. WriteLine("Exception Message: " & ex.Message)
    End Try
    Debug.WriteLine("Task IsCanceled: " & theTask.IsCanceled)
    Debug.WriteLine("Task IsFaulted:  " & theTask.IsFaulted)
    If theTask.Exception IsNot Nothing Then
        Debug.WriteLine("Task Exception Message: " &
            theTask.Exception.Message)
        Debug.WriteLine("Task Inner Exception Message: " &
            theTask.Exception.InnerException.Message)
    End If
End Function
Private Async Function DelayAsync() As Task(Of String)
    Await Task.Delay(100)
    ' Uncomment each of the following lines to
    ' demonstrate exception handling.
    'Throw New OperationCanceledException("canceled")
    'Throw New Exception("Something happened.")
    Return "Done"
End Function
' Output when no exception is thrown in the awaited method:
'   Result: Done
'   Task IsCanceled: False
'   Task IsFaulted:  False
' Output when an Exception is thrown in the awaited method:
'   Exception Message: Something happened. 
'   Task IsCanceled: False
'   Task IsFaulted:  True
'   Task Exception Message: One or more errors occurred.
'   Task Inner Exception Message: Something happened.
' Output when an OperationCanceledException or TaskCanceledException
' is thrown in the awaited method:
'   Exception Message: canceled
'   Task IsCanceled: True
'   Task IsFaulted:  False

Обработка нескольких исключений в асинхронных методах

В следующем примере демонстрируется обработка исключений, когда несколько задач могут привести к нескольким исключениям. Блок Try содержит Await выражение для возвращаемой задачи Task.WhenAll . Задача завершается после завершения трех задач, к которым Task.WhenAll применяется.

Каждая из трех задач вызывает исключение. Блок Catch выполняет итерацию по исключениям, которые находятся в свойстве Exception.InnerExceptions возвращаемой задачи Task.WhenAll .

Public Async Function DoMultipleAsync() As Task
    Dim theTask1 As Task = ExcAsync(info:="First Task")
    Dim theTask2 As Task = ExcAsync(info:="Second Task")
    Dim theTask3 As Task = ExcAsync(info:="Third Task")
    Dim allTasks As Task = Task. WhenAll(theTask1, theTask2, theTask3)
    Try
        Await allTasks
    Catch ex As Exception
        Debug.WriteLine("Exception: " & ex.Message)
        Debug.WriteLine("Task IsFaulted: " & allTasks.IsFaulted)
        For Each inEx In allTasks.Exception.InnerExceptions
            Debug.WriteLine("Task Inner Exception: " + inEx.Message)
        Next
    End Try
End Function
Private Async Function ExcAsync(info As String) As Task
    Await Task.Delay(100)
    Throw New Exception("Error-" & info)
End Function
' Output:
'   Exception: Error-First Task
'   Task IsFaulted: True
'   Task Inner Exception: Error-First Task
'   Task Inner Exception: Error-Second Task
'   Task Inner Exception: Error-Third Task

См. также раздел

  • Err
  • Exception
  • Оператор Exit
  • Оператор On Error
  • Рекомендации по использованию фрагментов кода
  • Обработка исключений
  • Оператор Throw

Обработка ошибок времени выполнения в JavaScript с помощью try/catch/finally

Обработка ошибок времени выполнения в JavaScript с помощью попробовать/поймать/наконец-то

Обработка ошибок, как и многие аспекты JavaScript, совершенствовалась с тех пор, как темные века Netscape и IE4. Вы больше не вынуждены соглашаться на то, что браузер бросает вам в лицо в случае ошибки JavaScript, но вместо этого может рассмотреть этот вопрос в вашем собственные руки. Оператор JavaScript try/catch/finally позволяет вы погружаетесь в ошибочную территорию и «перенаправляете», когда JavaScript «исключение» столкнулся. Наряду с другими методами защитного кодирования, такими как Объект обнаружение и событие onError, попробовать/поймать/наконец-то добавляет возможность ориентироваться в определенных ошибках, которые в прошлом были бы мгновенно остановлены ваш сценарий на своем пути. Больше не надо!

try/catch/finally

try/catch/finally — так называемая обработка исключений операторы в JavaScript. Исключением является ошибка, возникающая по адресу . время выполнения из-за недопустимой операции во время выполнения. Примеры исключения включают попытку сослаться на неопределенную переменную или вызов несуществующий метод. Это против синтаксические ошибки , которые ошибки, возникающие при наличии проблем с синтаксисом JavaScript. Рассмотрим следующие примеры синтаксических ошибок и исключений:

  • alert("Я пропускаю закрывающую скобку // синтаксическая ошибка
  • alert(x) // исключение, предполагающее, что "x" еще не определено
  • undefinedfunction() //исключение

попробовать/поймать/наконец-то позволяет изящно обрабатывать исключения. Однако он выдает , а не синтаксических ошибок (для них вам нужно использовать событие onerror). Обычно всякий раз, когда браузер сталкивается с исключение где-то в коде JavaScript, он отображает сообщение об ошибке для пользователя, прервав выполнение оставшегося кода. Вы можете поставить закрыть это поведение и обработать ошибку так, как вы видите подходит с помощью try/catch/finally . В самом простом случае вы бы просто используйте try/catch , чтобы попытаться запустить какой-нибудь код, а в в случае каких-либо исключений, подавить их:

 try{
неопределенная функция()
}
поймать (е) {
// ловим и просто подавляем ошибку
} 

Предполагая, что undefinedfunction() не определено, когда браузер запускает вышеуказанное, никаких ошибок не будет показано. Синтаксис для try/catch/finally это предложение try , за которым следует либо предложение catch , либо finally (по крайней мере, одно или оба из них). поймать 9Предложение 0006, если оно определено, перехватывает любые ошибки, произошел из попробуйте , и косвенно передается объект ошибки, который содержит дополнительную информацию об ошибке. Давайте рассмотрим немного более сложный пример сейчас:

 попробовать{
неопределенная функция()
alert('Думаю, вы существуете')
}
поймать (е) {
alert('Произошла ошибка: '+e.message)
} 

Нажмите на кнопку выше и обратите внимание, что только "Ошибка произошел" всплывает предупреждение, но не «я думаю, вы действительно существуете». Это говорит нам о том, что когда попробуй сталкивается с ошибкой, он немедленно пропускает любой оставшийся внутри него код и идет прямо к поймать . Сообщение об ошибке по умолчанию явно подавлено, хотя вы все равно можете получить эту информацию, обратившись к объекту Error который косвенно передается в catch . Мы рассмотрим объект Error в подробности на следующей странице.

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

 try{
неопределенная функция()
alert('Думаю, вы существуете')
}
поймать (е) {
alert('Произошла ошибка: '+e.message)
}
окончательно{
alert('Я предупрежден независимо от результата, указанного выше')
} 

наконец может быть полезен, когда вам нужно "очистить" после некоторого код внутри попробуйте . Хотя это правда , в конце концов, всегда будет выполняются, если определены, некоторые операторы внутри try, такие как continue , перерыв , вернуть , или когда произошла ошибка и нет предложения catch будет все заставить finally выполняться сразу же после этого. В следующих например, значение "5" настораживает, так как управление передается наконец когда я достигну 5 внутри попробуйте:

 попробуйте{
для (var i=0; i
Вложенные операторы try/catch/finally

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

 вар ajaxrequest=ноль
if (window.ActiveXObject){ //Проверка поддержки различных версий ActiveXObject в IE
пытаться {
ajaxrequest=новый ActiveXObject("Msxml2.XMLHTTP")
}
поймать (е) {
пытаться{
ajaxrequest=новый ActiveXObject("Microsoft.XMLHTTP")
} // конец внутренней попытки
поймать (е) {
alert("Я сдаюсь. Ваш IE не поддерживает Ajax!")
} //конец внутреннего улова
} // конец внешнего захвата
}
else if (window.XMLHttpRequest) // если Mozilla, Safari и т. д.
ajaxrequest=новый XMLHttpRequest()
ajaxrequest.open('GET', 'process.php', true) // делаем что-то с запросом 

Здесь я использую вложенный оператор try/catch , чтобы попытаться определить в IE какая версия объекта ActiveX, которую он поддерживает, необходима для инициализации Ajax-запрос. Использование обнаружения объектов здесь не сработает, так как проблема не поддерживает ли браузер ActiveXObject здесь, но какая версия.

  • Обзор try/catch/finally
  • Объект Error и выбрасывание собственного ошибки

Объект Error и выдача собственных ошибок

Что можно и чего нельзя делать с Try-Catch в JavaScript | Кайл ДеГузман

Научитесь обрабатывать ошибки с помощью try{}catch{} Быстро и просто

Фото Дэвида Пупаза

Доброе утро, друзья,

Несколько месяцев назад, когда я проводил технические собеседования, возникла проблема с обработкой ошибок. вверх. И вместо того, чтобы использовать простые операторы if-else, мой интервьюер действительно посоветовал мне использовать try-catch. Он не сказал этого прямо.; это было больше похоже на намек или поддразнивание. Он сказал что-то вроде «Если бы только существовал способ обработки исключений. ..». К счастью для меня, у меня был опыт использования операторов try-catch и throw в Java, поэтому я смог уловить то, что он сказал. Но, к сожалению для меня, я понятия не имел, как синтаксис будет отличаться в JavaScript.

Итак, сегодня мы поговорим об этом. Как мы используем try-catch? И когда мы должны использовать операторы if-else вместо try-catch?

Давайте.

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

Упрощенный шаблон Try-Catch

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

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

Вот как это объясняется в официальной веб-документации MDN:

Оператор try. ..catch помечает блок try и блок catch . Если код в блоке try выдает исключение, то будет выполнен код в блоке catch .

- Веб-документы MDN

Вам может быть интересно: о каком типе ошибок мы говорим? Буквально все. И в этом прелесть использования операторов try-catch вместо операторов if-else.

Ошибки могут быть связаны с программатором. Например, может быть, вы написали что-то неправильно. Вместо console.log() вы могли написать consolelog() или conle.log() . Вы поняли идею. И если продолжить изучение этого обоснования, ваш код может захотеть сделать что-то невозможное. Например, вы вызываете несуществующую функцию. Вы пытаетесь использовать несуществующую переменную или объект. Вы пытаетесь использовать утверждение, которое не имеет смысла — опять же, например, 9 с ошибкой.0005 console.log() .

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

Допустим, у вас есть переменная age , в которой хранится возраст пользователей. Как видите, если возраст меньше 18 лет, будет выдано сообщение об ошибке «Вы слишком молоды». И когда выдается эта ошибка, вместо блока try будет выполняться блок catch. Напротив, если возраст пользователя, например, 20 лет, ошибка не будет выдана. Блок try будет полностью выполнен, а блок catch никогда не будет выполнен.

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

Оператор try-catch действительно так прост. Для получения дополнительной информации ознакомьтесь с документацией Try-Catch.

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

❌Не используйте Try-Catch для проверки ввода

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

Нам нужно убедиться, что пользователь вводит именно то, что мы ожидаем.

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

Вот пример того, как школы W3 используют его для проверки ввода. Простых операторов if-else определенно достаточно. Вам вообще не нужно использовать try-catch.

✔️Используйте Try-Catch для обработки ошибок

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

✔️Используйте Try-Catch для настройки сообщений об ошибках

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

В этой статье мы очень кратко коснулись пользовательских сообщений об ошибках. Если вы хотите углубиться в это и узнать больше, ознакомьтесь с Custom Errors, Extension Error by Javascript.info. Он очень всеобъемлющий и простой для понимания. Кроме того, есть много примеров кода, так что вы можете попробовать сами.

✔️Используйте Try-Catch для перехвата ВСЕХ исключений

Если вы попытаетесь перехватить все исключения с помощью операторов if-else, вы в конечном итоге напишете много-много кода — и даже в этом случае вы, вероятно, даже не поймать все исключения.

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

Try-Catch великолепен, потому что он перехватывает все исключения — даже те, о которых вы не думаете или не ожидаете.

❌Не используйте Try-Catch для программной логики

Это НЕ тот случай, когда операторы if-else и try-catch могут использоваться взаимозаменяемо. У них обоих есть конкретные варианты использования и ниши для выполнения.

Опять же, используйте Try-Catch экономно и стратегически. Используйте try-catch исключительно для обработки ошибок. Не используйте try-catch ни для чего другого, например, для логики программы. Точно нет.

Спасибо за внимание. Если вы используете try-catch по-другому или у вас есть уникальные варианты их использования, я хотел бы прочитать об этом.