Классический asp-response.redirect в обработке ошибок - PullRequest
3 голосов
/ 04 января 2012

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

Запустить хранимую процедуру, которая вызывает ошибку

Dim cmd
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = con
cmd.CommandType = adCmdStoredProc
cmd.CommandText = "spReturnDBException"
cmd.Execute

Вызов функции обработки ошибок, которая устанавливает некоторые параметры сеанса и перенаправляет при необходимости

HandleErrors con _
            , Request.ServerVariables("PATH_INFO") _
            , "An error occurred while trying to save sessions." _
            , "Actual Error: " + Err.Description + " EmpNo: " + Session("EmpNo") _
            + ".  QueryString: " + Request.Querystring _
            , 0

Это будет субподпись.

sub HandleErrors( connection, WebPagePath, GenericErrorMessage, DebugInfo, Severity)


//Check for vb errors
if Err.Number <> 0 Then

    Session("WebPagePath") = WebPagePath 
    Session("SafeErrorMessage") = GenericErrorMessage 'Session("SafeErrorMessage") + "A connection was dropped while trying to complete sessions."
    Session("DebugInfo") = DebugInfo ' Err.Description
    Session("LineNo") = Err.Line 
    Session("StackTrace") = "" 
    Session("Severity") = Severity 

    response.redirect("Error.asp")  

    //error occurs
elseif connection.Errors.count <> 0 then 

    response.write("a database error occurred.")
    // Store safe error message / # in session
    Session("WebPagePath") = WebPagePath 
    Session("SafeErrorMessage") = GenericErrorMessage 'Session("SafeErrorMessage") + "An error has occurred while trying to save sessions."
    Session("DebugInfo") = DebugInfo '"Some extra added debug info from the webpage"
    Session("LineNo") = 0 
    Session("StackTrace") = ""
    Session("Severity") = Severity

    Dim objError
    for each objError in connection.Errors

        // Store safe error number in session
        Session("SafeErrorNumbers") = Session("SafeErrorNumbers") + objError.Description
        if connection.Errors.Count > 1 then
            Session("SafeErrorNumbers") = Session("SafeErrorNumbers") + "|"
        end if 

    next 

    response.Redirect("Error.asp")  
end if

Err.Clear

end sub

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Чтобы отобразить номер строки ошибки:

set objError = Server.GetLastError()
strErrorLine =  objError.Line

Вот несколько потоков об использовании Err.line:

http://www.daniweb.com/web-development/asp/threads/11615

http://www.sitepoint.com/forums/showthread.php?279612-ASP-Error-Handling.-Err.Line-weird-behavior

0 голосов
/ 04 января 2012

Я не могу объяснить, почему вы получаете результаты, которые вы есть. Я могу сказать вам, что если ваш код достигает строки, содержащей Response.Redirect, то перенаправление произойдет независимо от того, находится ли он в процедуре Sub или нет.

Я бы сделал это предложение. Прекратите использовать On Error Resume Next. Это очень болезненный способ справиться с исключениями.

Вместо этого измените HandleErrors на GenerateConnectionError. Его работа будет состоять в том, чтобы составлять строки ошибок и описания и преднамеренно вызывать Err.Raise с определяемым пользователем номером ошибки (я склонен использовать 1001).

Теперь ваш Error.asp должен быть установлен в корне вашего приложения в качестве обработчика для кода состояния HTTP 500.100. При возникновении ошибки сценария IIS ищет текущую коллекцию страниц ошибок, чтобы определить, что делать. Вы зададите этот параметр для выполнения URL-адреса и укажите свой Error.asp в качестве URL-адреса.

Когда Error.asp будет запущен, он найдет подробную информацию о странице, запрашиваемой у QueryString. Здесь вы также можете использовать Server.GetLastError, чтобы получить объект ASPError, из которого вы можете получить другие сведения об ошибке.

Использование этого подхода детализирует все ошибки скрипта, не требуя от разработчика не забывать перелистывать свой код кодом HandleError. При выполнении кода, использующего ADODB.Connection, разработчик должен не забывать вызывать GenerateConnectionError, и даже в этом случае вы, вероятно, можете абстрагировать его внутри включаемого файла .asp.

...