从另一个类的捕获中优雅地返回到.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.
基本上我只需要一种方式来发出信号,从这个方法,调用页面只是停止并优雅地显示一个错误,而不是给用户一个巨大的丑陋的不可恢复的错误消息。任何建议吗?
你为什么不从你的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")
有很多方法可以做到这一点,但也许只是返回一个空的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.
}
}
-
首先你的方法得到Employee (EmployeeDB.GetItem(employeeid);)应该返回null而不是抛出异常。在对对象进行任何操作之前,您应该进行空检查。
-
其次,我们不应该抛出ex,除非你添加了额外的信息。不如直接说"throw",因为这不会破坏堆栈跟踪。此外,如果你在异常块中没有做任何事情,只需让异常冒泡并在那里处理。
在你的例子中,如果你检查null,你不需要处理异常
显示方法错误,应该改为:
HttpContext.Current.Response。Write("alert('"提供的EmployeeID无效。"')");
我不认为使用Response是一个好主意。从您的代码中编写,因为它将在页面的开头呈现(甚至在HTML标记之前)。但是有几个选项:
-
您可以在代码隐藏页面中捕获NullReferenceException。在那里,您可以访问页面并调用ClientScript。
-
从库中的代码中,你可以使用HttpContext.Current.Response.
来访问响应对象。
你应该像这样捕获异常
catch (NullreferenceException ex)
{
// handle exception, e.g.
HttpContext.Current.Response.Write("...");
}
所有其他异常都将被解除处理,并向上遍历堆栈。
编辑:除了直接写入响应之外(这不是一个好主意),您有以下选项:
- 用HttpContext.Current.Response.Redirect(" error .aspx")重定向到另一个页面(解释错误);
注册JavaScript
catch (NullreferenceException ex) { string javaScript = "alert('The EmployeeID supplied is not valid');"; HttpContext.Current.Page.ClientScript.RegisterStartupScript(typeof(thePage), "myScript", javaScript, true); }