从另一个类的捕获中优雅地返回到.aspx.cs文件

本文关键字:返回 aspx 文件 cs 另一个 | 更新日期: 2023-09-27 18:17:34

我有一个web项目,有一个名为editemployee.aspx的页面。背后的代码是editemployee.aspx.cs。从这些代码中,我调用另一个项目,一个类库。我在类库中调用的方法看起来像…

        public static Employee GetItem(int employeeid)
        {
            try
            {
                Employee chosenemployee = EmployeeDB.GetItem(employeeid);
                chosenemployee.EmployeeInsuranceRecord = EmployeeInsuranceRecordManager.GetItem(employeeid);
                return chosenemployee;
            }
            catch (Exception ex)
            {
                if (ex is NullReferenceException)
                {
                    //How can I return gracefully from here
                    //without disrupting the user experience?
                }
                else
                {
                    throw ex;  //if it makes it this far, it must be some other unknown error and I need an exception to be thrown for real so I can track down the bug.
                }
            }
        }

基本上,这段代码根据传递的EmployeeID从数据访问层获取完整的员工记录。如果异常是NullReferenceException,那就意味着有一个假的EmployeeID通过了。在这种情况下,我想要做的是返回到调用.aspx.cs的页面,停止对Employee进行排序的过程,并显示一个JavaScript警告框,提示"提供的EmployeeID无效"。

所以我试着说:

            if (ex is NullReferenceException)
            {
                Response.Write("<script>alert('"The EmployeeID supplied is not valid."')</script>"); 
            }

但是这不能在一个单独的类库中工作,它不能识别Response.Write.

基本上我只需要一种方式来发出信号,从这个方法,调用页面只是停止并优雅地显示一个错误,而不是给用户一个巨大的丑陋的不可恢复的错误消息。任何建议吗?

从另一个类的捕获中优雅地返回到.aspx.cs文件

你为什么不从你的editemployee.aspx.cs捕获你的NullReferenceException ?比如:

try
{
    var employee = Employee.GetItem(int employeeid)
}
catch(NullReferenceException ex)
{
    Response.Write("<script>alert('"The EmployeeID supplied is not valid."')</script>"); 
}

另外,您应该而不是使用is操作符来过滤异常类型,而是在catch语句中添加正确的类型。

catch块可以指定要捕获的异常类型。此类型称为异常筛选器,必须是exception类型,或者从该类型派生。应用程序定义的异常应该从ApplicationException派生。

(源)

最后,建议抛出更具体的Exception。在您的情况下,最好从业务层抛出一个自定义的EmployeeNotFoundException

catch(NullReferenceException ex)
{
     throw new EmployeeNotFoundException(ex);
}

如果您想使用您尝试过的代码,您可以编写HttpContext.Current.Response.Write("Whatever")

一个更好的解决方案是显示一个自定义的错误页面。这里有一篇文章描述了如何做到这一点:http://www.asp.net/web-forms/tutorials/deployment/displaying-a-custom-error-page-cs

有很多方法可以做到这一点,但也许只是返回一个空的Employee对象(或者用一些标记代码填充它),然后在返回端,检查你的标记代码,然后执行JS来提醒用户。

类似:

catch (Exception ex)
            {
                if (ex is NullReferenceException)
                {
                    return new Employee { Name = string.Empty }; // no idea what the Emp object looks like...
                    // or
                    return new Employee { Name = "666" };
                }
                    else
                    {
                        throw ex;  //if it makes it this far, it must be some other unknown error and I need an exception to be thrown for real so I can track down the bug.
                    }
                }

  1. 首先你的方法得到Employee (EmployeeDB.GetItem(employeeid);)应该返回null而不是抛出异常。在对对象进行任何操作之前,您应该进行空检查。

  2. 其次,我们不应该抛出ex,除非你添加了额外的信息。不如直接说"throw",因为这不会破坏堆栈跟踪。此外,如果你在异常块中没有做任何事情,只需让异常冒泡并在那里处理。

在你的例子中,如果你检查null,你不需要处理异常

显示方法错误,应该改为:

HttpContext.Current.Response。Write("alert('"提供的EmployeeID无效。"')");

我不认为使用Response是一个好主意。从您的代码中编写,因为它将在页面的开头呈现(甚至在HTML标记之前)。但是有几个选项:

  1. 您可以在代码隐藏页面中捕获NullReferenceException。在那里,您可以访问页面并调用ClientScript。

  2. 从库中的代码中,你可以使用HttpContext.Current.Response.

  3. 来访问响应对象。

你应该像这样捕获异常

catch (NullreferenceException ex)
{
   // handle exception, e.g.
   HttpContext.Current.Response.Write("...");
}  

所有其他异常都将被解除处理,并向上遍历堆栈。

编辑:除了直接写入响应之外(这不是一个好主意),您有以下选项:

  1. 用HttpContext.Current.Response.Redirect(" error .aspx")重定向到另一个页面(解释错误);
  2. 注册JavaScript

    catch (NullreferenceException ex)
    {
        string javaScript = "alert('The EmployeeID supplied is not valid');";
        HttpContext.Current.Page.ClientScript.RegisterStartupScript(typeof(thePage), "myScript", javaScript, true);
    }