14.C#/.NET编程中的常见异常(持续更新)

1.Object reference not set to an instance of an object.

  未将对象引用(引用)到对象的实例,说白了就是有个对象为null,但是你在用它点出来的各种东西。

2.An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

  一个实体对象不能由多个IEntityChangeTracker实例引用。首先参见MSDN中对于Entity Framework中的增删改的说明,特别是修改对象那里。我们看到说明文档里有这样一句话“对象服务使用IEntityChangeTracker的实例来跟踪对附加到ObjectContext的对象的更改”,1)Tracker是用来跟踪某个对象属性更改的,2)被跟踪的是附加到某个上下文的对象,3)错误信息是说一个对象不能被多个Tracker跟踪,即一个附到特定的Context中的对象有一个Tracker。

  然后我觉着帮我解决这个问题的博客,说的不是太清楚,也可能是我理解能力比较差,试着自己分析一下。对应到原帖,An Entity指的肯定是user,为什么它会有多个IEntityChangeTracker的实例,明显是因为他被附到两个Context中,RoleManager.GetRoleById()方法和UserManager.Add()方法的上下文也就是Entities不一样。

  通俗来讲,对于同一个实体对象(数据库关联)的操作,请在同一个上下文中完成。

3.Collection was modified; enumeration operation may not execute.

  对于一个集合进行foreach遍历,如果foreach中对集合有添加和移除操作,就会报这个错。

  这是IEnumerator自身的特性决定,参见备注部分:

--------------------------------大家晚上好--------------------------------

  只要集合保持不变,枚举数就保持有效。如果对集合进行了更改(如添加、修改或删除元素),则枚举数将失效且不可恢复,并且下一次对 MoveNext 或 Reset 的调用将引发 InvalidOperationException。如果在 MoveNext 和 Current之间修改集合,那么即使枚举数已经无效,Current 也将返回它所设置成的元素。

  枚举数没有对集合的独占访问权;因此,枚举通过集合在本质上不是一个线程安全的过程。即使一个集合已进行同步,其他线程仍可以修改该集合,这将导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。

--------------------------------大家晚上好--------------------------------

  只需要把foreach改为for来遍历就好了。有几个画图的错我忘了。。。今天先写这么多好了

4.Unrecognized attribute 'targetFramework'.

  这个错误发生在网站发布过程中,即分析器错误消息: 无法识别的属性“targetFramework”。请注意属性名称区分大小写。

  问题在今天(2014-11-25)上线的时候发生的,原因是IIS应用程序池的.NET CLR version配置错误。

  (PS:超链接中对于上线过程中出现的一些未知概念有相应解释,诸如w3wp.exe等。)

  

  通常一个网站对应一个与网站同名的应用程序池,IIS的应用程序池.NET CLR版本应当与开发使用的.NET CLR版本一致。

  本机上一般是2.0版本,开发时使用的版本通常较高,从而导致不匹配。参考

5.Object moved to here

      使用Response.Redirect()方法时,如果传入的是null或者“”,在页面上就会显示Object moved to here。

      这是因为服务器返回给浏览器一个302指令要求重新跳转,但是并没有发给其要跳转的url,浏览器不知道要跳转到哪里。参考

posted on 2014-11-24 22:43  Hanny_  阅读(663)  评论(0编辑  收藏  举报