c# - 对象引用未设置为对象的实例:堆栈跟踪显示错误的行号
问题描述
我已经解决了这个问题(下面的解释),但我试图弄清楚为什么堆栈跟踪给了我错误的行。
概述:这是一个Repeater控件,允许教授标记考试,一次一个问题,同时仍然能够查看整个考试。
基本思想(pseudo.aspx):
<asp:repeater>
<ItemTemplate>
<fields/>
<textbox id="grade">
<asp:LinkButton ID="UpdateButton" runat="server" Text="Update" OnClick="OnUpdate" />
</ItemTemplate>
</asp:repeater>
假设用户输入一个成绩,在 OnClick 事件中数据库中的问号被更新,整个页面再次被数据绑定。
代码:
protected void OnUpdate(object sender, EventArgs e)
{ // I broke this down line by line trying to trace the error.
LinkButton button = (LinkButton)sender; //Object Not set exception here!!!
object o = button.Parent;
RepeaterItem item = o as RepeaterItem;
int StudentID = int.Parse((item.FindControl("StudentKeyLabel1") as HiddenField).Value);
string ExamID = (item.FindControl("ExamIDLabel1") as HiddenField).Value.Trim();
int QuestionID = int.Parse((item.FindControl("QuestionIDLabel1") as HiddenField).Value);
int Grade;
try
{
Grade = int.Parse((item.FindControl("GradeTextBox") as TextBox).Text);
// Update DB
}
catch (FormatException)
{ // Message to user - bad or missing grade }
//Custom Databind
}
我已将 .aspx 中的字段从标签更改为 aspx 中的隐藏字段,但忘记在 .aspx.cs 文件中更改它们——这是错误的实际原因。
但是,堆栈跟踪 (customerrors="Off") 显示 Object 引用未设置为类型 Object 发生在这一行:
LinkButton button = (LinkButton)sender; //Object Not set error here!!!
但实际错误是下面几行。
因此,我的疏忽需要很长时间才能解决。您可以看到我逐行分解了对 RepeaterItem 的检索,并throw new Exception(xxx.GetType().ToString()
在每一行试图弄清楚它之后放了一个来检查参考有效性。有趣的是,原来的错误并没有出现在手动抛出下方时。
为什么堆栈跟踪显示异常来自代码中的错误位置?
解决方案
堆栈跟踪中的行号可能错误的原因有很多。这里仅仅是少数:
- 您在编译程序后编辑了代码。现在源代码行号和运行代码不匹配。
- 您正在运行该程序的优化版本。优化可能会导致错误地报告行号。
- 您已经使用 IL 注入工具修改了编译后的代码,现在生成的代码与调试信息不匹配。这可能会导致报告错误的行号。
基本上,有三样东西:源代码、生成的 IL 代码,以及包含描述源和 IL 之间关系的调试信息的 PDB。如果其中任何一个因任何原因不匹配,那么它们不匹配,因此您可以观察到它们不匹配。
推荐阅读
- javascript - 如何使用循环和 if else 语句分配随机数?
- python - 将列和默认数据附加到新的 Pandas DataFrame 中
- amazon-web-services - 我可以使用 Cloudformation 在特定可用区中创建子网吗?
- vba - 在 VBA 中使用列函数中的变量作为参数
- sql - 如何根据日期以一个月的增量填充表格
- javascript - 文件未加载到 HTML 文本区域
- php - 如何使用php将单个文件拆分为多个文件?
- python - 在提交之前如何检索对模型实例所做的更改?
- php - 未捕获的异常 'Exception' 带有消息 'Option `access_token` 只能是一个字符串。
- node.js - 通过 NestJs dockerized 应用程序提供静态资产