Возможна ли в ASP Classic обработка ошибок типа try-catch? - PullRequest
37 голосов
/ 23 января 2009

Какие опции есть в ASP Classic для обработки ошибок?

Например:

Я использую функцию Mail.SendMail, но при включении сервера тестирования она не работает, что нормально. Я хочу проверить, возможна ли рассылка, если нет, то продолжить и / или показать сообщение.

Есть идеи?

Ответы [ 8 ]

48 голосов
/ 23 января 2009

Существует два подхода: вы можете кодировать в JScript или VBScript, которые имеют конструкцию, или вы можете использовать ее в своем коде.

Используя JScript, вы использовали бы следующий тип конструкции:

<script language="jscript" runat="server">
try  {
    tryStatements
}
catch(exception) {
    catchStatements
}
finally {
    finallyStatements
}
</script>

В вашем ASP-коде вы выдумываете его, используя следующее при возобновлении ошибки в тот момент, когда вы попытаетесь проверить err.Number в точке перехвата, например:

<%
' Turn off error Handling
On Error Resume Next


'Code here that you want to catch errors from

' Error Handler
If Err.Number <> 0 Then
   ' Error Occurred - Trap it
   On Error Goto 0 ' Turn error handling back on for errors in your handling block
   ' Code to cope with the error here
End If
On Error Goto 0 ' Reset error handling.

%>
9 голосов
/ 04 апреля 2013

Относительно ответа Wolfwyrd: «On Error Resume Next» фактически отключает обработку ошибок! Не на. On Error Goto 0 снова включает обработку ошибок, потому что, по крайней мере, мы хотим, чтобы машина его ловила, если мы не записывали ее в себя. Выкл = оставляю это вам.

Если вы используете On Error Resume Next, вам нужно быть осторожным с тем, сколько кода вы добавляете после него: помните, фраза «If Err.Number <> 0 Then» относится только к самой предыдущей ошибке, вызванной.

Если в вашем блоке кода после «On Error Resume Next» есть несколько мест, в которых вы могли бы разумно ожидать, что он потерпит неудачу, то вы должны поместить «If Err.number <> 0» после каждой из этих возможных строк ошибок , чтобы проверить исполнение.

В противном случае, после «при возобновлении с ошибкой далее» означает только то, что написано: ваш код может завершиться с ошибкой на столько строк, сколько ему нужно, и выполнение будет продолжаться весело. Вот почему это боль в заднице.

8 голосов
/ 31 октября 2014

1) Добавить On Error Resume Next вверху страницы

2) Добавить следующий код внизу страницы

If Err.Number <> 0 Then

  Response.Write (Err.Description)   

  Response.End 

End If

On Error GoTo 0
7 голосов
/ 09 сентября 2009

Довольно хороший способ справиться с отсутствующими классами COM:

Dim o:Set o = Nothing
On Error Resume Next
Set o = CreateObject("foo.bar")
On Error Goto 0
If o Is Nothing Then
  Response.Write "Oups, foo.bar isn't installed on this server!"
Else
  Response.Write "Foo bar found, yay."
End If
4 голосов
/ 06 декабря 2011

оператор On Resume Resume Next должен располагаться поверх того, что мы хотим проверить.

  On Error Resume Next
  'Your code logic is here

Тогда закончите с утверждением как:

  If Err.Number <> 0 then

  'Your error message goes here'

  End if
4 голосов
/ 25 января 2010

Для любого, кто работал в ASP, а также на более современных языках, этот вопрос вызовет смешок. По моему опыту использование пользовательского обработчика ошибок (настроенного в IIS для обработки 500; 100 ошибок) является лучшим вариантом для обработки ошибок ASP. В этой статье описывается подход и даже приводится пример определения кода / таблицы базы данных.

http://www.15seconds.com/issue/020821.htm

2 голосов
/ 23 января 2009

Некоторое время назад я был на земле ASP, но в iirc есть несколько способов:

try catch finally может быть разумно смоделировано в VBS (хорошая статья здесь здесь ), и есть событие под названием class_terminate, которое можно наблюдать и ловить исключения глобально. Тогда есть возможность изменить язык сценариев ...

1 голос
/ 09 сентября 2009

Некоторые сценарии не всегда позволяют разработчикам переключать язык сценариев.

Я предпочитаю JavaScript (и я использовал его в новых проектах). Тем не менее, поддержка старых проектов все еще требуется и необходимо. К сожалению, они написаны на VBScript.

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

...