Genexus中的应用程序级错误处理

时间:2019-06-03 19:17:14

标签: c# .net genexus

我正尝试在Genexus Ev1(C#生成器)中处理复制级别的错误,以便在发生异常时将其记录下来。

在网络上搜索发现可以通过以下方法解决要求:

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

在web.config级别添加CustomError页面可以正常工作,但是我无法在该页面中检索服务器有关该错误的信息。下面显示的变量&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);
   }
 }
}

有人已经尝试在GeneXus中这样做吗? 任何人都可以澄清我在做什么错吗?

1 个答案:

答案 0 :(得分:0)

经过几天的研究,我设法解决了这个问题。

这是我所做的:

  • 创建一个文本文件并将其命名为Global.asax
  • 将该文件移动到应用程序的Web根文件夹
  • 编辑文件内容并添加此代码

    <%@ 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中创建新的Web面板并将其命名为ErrorPageLog

  • 编辑事件开始,添加此代码并构建它

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

那应该将应用程序错误引发的Web会话转移到页面上,然后您可以对消息执行任何操作,还可以管理发生在GeneXus代码中的消息。

注意:在此示例中,我发送的是有关异常的最简单信息,可以管理有关该异常的更多详细信息。