抛出错误但不向用户显示错误的最干净方法(没有自定义错误页面)

本文关键字:错误 方法 自定义 出错 用户 显示 | 更新日期: 2023-09-27 18:24:08

我正在运行一些只需运行一次的代码,但它取决于外部资源,可能会失败。我希望错误出现在事件日志中,但不希望用户看到它。如果可能的话,我希望避免使用自定义错误页面。

我可以自己捕捉异常并将其写入事件日志,但我担心我无法保证asp.net事件源的名称(它似乎会根据框架版本而更改。)我也无法创建自己的事件源,因为这需要管理权限。

我目前正在努力的方法有点像黑客(还不起作用),看起来是这样的:

    public void Init(HttpApplication context)
    {
        try
        {
            throw new Exception("test"); // This is where the code that errors would go
        }
        catch (Exception ex)
        {
            HttpContext.Current.Application.Add("CompilationFailed", ex);
        }
    }
    private void context_BeginRequest(object sender, EventArgs e)
    {
        if (HttpContext.Current.Application.AllKeys.Contains("CompilationFailed"))
        {
            // It failed on Init - we can't throw an exception there so lets try it here
            var origEx = (Exception)HttpContext.Current.Application["CompilationFailed"];
            // Only ever do this once
            HttpContext.Current.Application.Remove("CompilationFailed");
            // This should just look like a normal page load to the user 
            // - it will be the first request to the site so we won't be 
            //  interrupting any postbacks or anything

            HttpContext.Current.Response.AddHeader("Location", "/");
            HttpContext.Current.Response.StatusCode = 301;
            try
            {
                HttpContext.Current.Response.End();
            }
            catch (ThreadAbortException ex)
            {
                throw origEx; 
            }
        }
    }

理想情况下,如果存在类似的方法,我真正想要的是IIS中的RecordException()方法。

抛出错误但不向用户显示错误的最干净方法(没有自定义错误页面)

我建议将Elmah用于ASP.NET。

听起来你想在出现错误时得到通知,但不想让用户知道。你可以重定向页面(如果出现致命错误),或者在向你发送电子邮件或写入你可以访问的数据源后完成文件/页面的其余部分的执行。