Обработка ошибок на уровне приложения в Genexus

Я пытаюсь обрабатывать ошибки на уровне приложения в Genexus Ev1 (генератор С#), поэтому при возникновении исключения его можно зарегистрировать.

Поиск в Интернете обнаружил, что это требование можно решить следующим образом:

https://docs.microsoft.com/en-us/aspnet/web-forms/overview/getting-started/getting-started-with-aspnet-45-web-forms/aspnet-error-handling

добавление страницы CustomError на уровне web.config работает нормально, но я не могу получить информацию сервера об ошибке на странице. Переменная &ErrorMsg, показанная ниже, всегда возвращает пустое значение.

Event Start

    &ErrorMsg.SetEmpty()
    CSHARP System.Web.HttpServerUtility Server = System.Web.HttpContext.Current.Server;
    CSHARP Exception ex = Server.GetLastError();
    CSHARP     if (ex != null) {
    CSHARP          ex = ex.GetBaseException();
    CSHARP          [!&ErrorMsg!] = ex.ToString();
    CSHARP  }

EndEvent

Приведенный выше код (и многие другие варианты) не работает.

Я предполагаю, что это нормально, потому что исключение сервера очищается, когда достигается страница ошибки, выполняющая этот код, поэтому исключение равно null, тогда файл Global.asax должен быть настроен для перехвата и передачи исключения

Эта проблема:

В веб-приложениях GeneXus нет файла global.asax, поэтому добавление его вручную с выполнением кода ниже также не работает.

<%@ language="C#" %>
<script runat="server">
void Application_Error(object sender, EventArgs e){

// Code that runs when an unhandled error occurs.

// Get last error from the server
Exception exc = Server.GetLastError();
if (exc is HttpUnhandledException){
    if (exc.InnerException != null){
        exc = new Exception(exc.InnerException.Message);
Server.Transfer("ErrorPageLog.aspx?handler=Application_Error%20-%20Global.asax",
      true);
   }
 }
}

Theres anyone who have tried to do this in GeneXus already? Anyone can clarify what I'm doing wrong?


person Pablo Acebal    schedule 03.06.2019    source источник


Ответы (1)


После нескольких дней исследований мне удалось решить эту проблему.

Вот что я сделал:

  • Создайте текстовый файл и назовите его Global.asax.
  • Переместите этот файл в корневую веб-папку приложения.
  • Отредактируйте содержимое файла и добавьте этот код

    <%@ Application Language="C#" %>
    <script runat="server">
        void Application_Start(object sender, EventArgs e)
       {
           // Code that runs on application startup
       }
       void Application_End(object sender, EventArgs e)
       {
       //  Code that runs on application shutdown
       }
       void Session_Start(object sender, EventArgs e)
       {
       // Code that runs when a new session is started
       Session["ServerException"] = "";
       }
       void Session_End(object sender, EventArgs e)
       {
       // Code that runs when a session ends.
       // Note: The Session_End event is raised only when the sessionstate mode
       // is set to InProc in the Web.config file. If session mode is set to StateServer
       // or SQLServer, the event is not raised.
       }
    
       protected void Application_Error(Object sender, EventArgs e)
       {
       // Code that runs when an unhandled error occurs.
    
       // Get last error from the server
       Exception exc = Server.GetLastError();
       Session["ServerException"] = exc.InnerException.Message;
    
       Server.ClearError();
       Response.Clear();
       Response.Redirect("ErrorPageLog.aspx");
    
       }
       </script>
    
  • Создайте новую веб-панель в GeneXus KB и назовите ее ErrorPageLog.

  • Отредактируйте начало события, добавьте этот код и создайте его.

    Event Start
        &ErrorMsg.SetEmpty()
    
        CSHARP [!&ErrorMsg!] = System.Web.HttpContext.Current.Session["ServerException"].ToString();
    EndEvent    
    

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

ПРИМЕЧАНИЕ. В этом примере я отправляю самую простую информацию об исключении, более подробной информацией об этом можно управлять.

person Pablo Acebal    schedule 06.06.2019