Свойства, отсутствующие в объекте ошибки ASP / VBScript - PullRequest
0 голосов
/ 28 октября 2019

Это , а не , то же самое, что и другой вопрос, потому что совет в другом вопросе не работает для меня. Я специально пытаюсь определить, что отличается в моем случае, что это не работает.

Я работаю в Classic ASP. Согласно документам, которые я нахожу в Интернете (здесь и в других местах: https://www.w3schools.com/ASp/asp_ref_error.asp), объект ошибки ASP должен иметь следующие свойства, среди прочего:

  • Описание: Возвращает краткое описаниеошибка
  • Файл: возвращает имя файла ASP, сгенерировавшего ошибку.
  • Строка: возвращает номер строки, в которой была обнаружена ошибка.
  • Число: возвращает стандартную ошибку COM. код ошибки

У меня есть следующий тестовый код. Примечание error_log() - это пользовательская функция, которая записывает текст в файл журнала.

on error resume next
    blah
    if err.number > 0 then
        error_log( err.number )
        error_log( err.description )
        error_log( err.file )
        error_log( err.line )
    end if
on error goto 0

Первые две строки, number и description, записываются, как ожидается;но file и line нет. Насколько я могу судить, последние два свойства просто недоступны для моей копии ASP / VBScript. Почему у меня нет этих свойств?

Я использую, как мне кажется, последнюю (около 2000 г.) версию классического ASP VBScript. Прямо изо рта лошади: VBScript 5.8 build 16384

EDIT: попытки запустить Server.GetLastError() не удаются. Похоже, у меня нет этой команды по какой-то причине. [ИСПРАВЛЕНИЕ: работает, но, похоже, данных нет. См. Примеры ниже]

Новый минимальный пример:

On Error Resume Next
    blah    'This is our error. unrecognized variable'
    Set error = Server.GetLastError()
    response.write error.file
On Error Goto 0
response.end

В результате появляется пустой экран. Данные об ошибках не записываются.

Еще один тест. Примечание «ошибка» и автоматически сгенерированный «err»:

On Error Resume Next
    blah    'This is our error. unrecognized variable'
    Set error = Server.GetLastError()
    response.write error.number
    response.write " | "
    response.write err.number
    response.write "<br>" & vbCrLf
    response.write error.description
    response.write " | "
    response.write err.description
    response.write "<br>" & vbCrLf
    response.write error.file
    response.write " | "
    response.write error.line
On Error Goto 0
response.end

Результат:

0 | 500
| Variable is undefined
| 0

1 Ответ

1 голос
/ 29 октября 2019

Для начала, для каждого пользователя Lankymart, существует разница между автоматическим объектом err и объектом, возвращаемым Server.GetLastError(). Для этого нам понадобится последний из двух.

Кажется, что Classic ASP возвращает немного другой код ошибки: 500.100;поэтому, если вы хотите захватить данные об ошибках, вы должны явно создать страницу ошибок для этого субкода.

Информация найдена здесь: https://stackoverflow.com/a/9407559/339440

Классический ASP всегда возвращалсястатус 500.100 при наличии ошибки сценария [...].

Если вы хотите отлавливать ошибки сценария Classic ASP и иметь возможность прочитать объект Server.GetLastError () на пользовательской странице ошибок (скажем, дляведение журнала) вам необходимо предоставить обработчик специально для 500.100.

Если вы не укажете пользовательскую ошибку 500.100, то IIS вернется к вашей пользовательской (или собственной) странице 500 ошибок , кроме Сервера. GetLastError () не предоставит никакой полезной информации об ошибке .

Так что ссылка на ошибку "на месте" не работает, а перехват стандартной ошибки 500 не работает. Вам нужно явно перехватить код 500.100. При обычной ошибке 500 Server.GetLastError() возвращает объект без данных - именно в этом и заключается моя проблема.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...