会话引发了一个看不见的捕获
本文关键字:看不见 一个 会话 | 更新日期: 2023-09-27 18:31:03
这是我的代码:
public partial class context_userpanel_IoSocial : iUserControl
{
protected void Page_Load(object sender, EventArgs e)
{
Session["oom-user"] = "utente";
if ((UserOOM)Session["oom-user"] == null)
{
Response.Write("not logged");
}
Response.Write("logged");
}
}
Session["oom-user"]
中的对象类型为 UserOOM
。但是如果我在会话中存储一个字符串,我看不到任何Response.Write
.为什么会这样?我该如何解决它?
您
看不到任何Response.Write
,因为强制转换为UserOOM
失败,并出现运行时异常,导致应用程序关闭。
如果要将不同类型的数据存储在同一会话变量中(这可能不是最好的主意),则必须在取出它们时使用is
/as
而不是直接强制转换,例如:
if (Session["oom-user"] is UserOOM)
{
// something
}
else if (Session["oom-user"] is string)
{
// something else
}
Session["oom-user"]
中的对象类型为UserOOM
。
不是来自您的代码:
Session["oom-user"] = "utente";
这会Session["oom-user"]
string
,并使类型转换失败并出现异常。
字符串"utente"
类型UserOOM
吗?不。
您需要修复if
子句,如果您只想检查它是否null
,则根本不需要强制转换:
Session["oom-user"] = "utente";
if (Session["oom-user"] == null)
{
Response.Write("not logged");
}
else
{
Response.Write("logged");
}
这种"认证"显然不是很安全:)
引发
不可见异常的不是Session
对象,异常也不是不可见的。
想象一下:你有一个 object 类型的变量,它存储了一个字符串。
object variable = "Test";
然后使用 convert
运算符将其值强制转换为不兼容的类型(这不是string
或string
的子类,但string
是密封类型,所以string
就可以了):
SomeOtherClass asAstring = (SomeOtherClass)variable;
这失败了,InvalidCastException
与as
运算符的操作有关:
SomeOtherClass thisWillBeNUll = variable as SomeOtherClass;
所以你看,抛出异常的不是Session
对象。当你写的时候
if ((SomeClass)Session["somekey"] == null) { ... }
你实际上是在写:
object thisIsOk = Session["somekey"]; // this is not the throwing place
SomeClass temp = (SomeClass)thisIsOk; // this is the throwing place
// and you won't be reaching any code until the closest `catch` clause up the stack
if (temp == null) {
}
protected void Page_Load(object sender, EventArgs e)
{
object obj = Session["oom-user"];
if (obj is UserOOM)
{
Response.Write("logged in");
}
else
{
Response.Write("not logged in");
}
}