乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 257|回复: 12

追逐和理解eInvalidContext..

[复制链接]

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2020-6-1 14:50:58 | 显示全部楼层 |阅读模式
我正试图找出一个eInvalidContext错误。不幸的是,我不能在我的开发机器上复制它,我只有错误报告可以处理。我怀疑这与基于我有限的网络搜索结果完成交易有关
该错误似乎是在提交事务后由我的代码引起的(下面第39行)。使用OpenCloseTransaction可能会解决这个问题,但我不确定它是否会解决,我想更好地了解发生了什么。我必须承认,我甚至不了解这段代码中的
上下文是什么。
这里有人能解释为什么会发生eInvalidError吗?
我错误报告中的堆栈跟踪是
  1. moduleAutodesk.AutoCAD.DatabaseServices.Transaction
  2. context-lineVoid DeleteUnmanagedObject()
  3. moduleAutodesk.AutoCAD.Runtime.DisposableWrapper
  4. context-lineVoid !DisposableWrapper()
  5. moduleAutodesk.AutoCAD.Runtime.DisposableWrapper
  6. context-lineVoid Dispose(Boolean)
  7. moduleAutodesk.AutoCAD.Runtime.DisposableWrapper
  8. context-lineVoid Dispose()
  9. moduleAID.CAD_Utility.Layers
  10. context-lineBoolean MakeLayer(System.String, Int16, Boolean)

对于上下文,代码是通过命令调用调用的,我在命令调用中捕获错误并报告它
[CommandMethod(“IR_AssignDripFlows”)]
公共静态void AssignDripFlowsToBlocks()
{
试试
{
DripFactory.AssignDripFlows()
}
捕获(例外e)
{
AID_Application.HandleError(e)
}
}
代码似乎在抛出错误:
/
///制作图层,确保其解冻并打开。
//
//
层的名称。
//
颜色。
//
是否打印该层
//
如果层名称有效,则为True;如果层名称无效,则为false。
公共静态bool MakeLayer(stringlayername,shortcolor=7,bool print=true)
{
if(utility.IsValidSymbolName(layerName))
{
使用(Active.Document.LockDocument())
{
使用(Transaction tr=Active.Document.TransactionManager.StartTransaction())
{
LayerTable:LayerTable=(LayerTable)tr.GetObject(Active.Database.LayerTableId,OpenMode.ForWrite)
如果(!layerTable.Has(layerName))
{
LayerTableRecord newLayer=新的layerTargetRecord
{
Name=layerName,
Color=Color.FromColorIndex(ColorMethod.ByAci,Color),
IsPlottable=print
}
layerTable.Add(新层)
tr.AddNewlyCreatedDBObject(newLayer,true)
}
其他
{
//确保它解冻并打开。(也许我们应该解锁它?)
<div>LayerTableRecord ltr=tr.GetObject(layerTable[layerName],OpenMode.ForWrite)作为LayerTargetRecord
如果(ltr!=null)
{
如果(ltr.isfreeze)ltr.is freeze=false
ltr.IsOff=false
}
}
tr.Commit()
}/
}
}
其他
{
处于活动状态。写消息(“\n无效层名称:“+Layername”)
}
返回Utility.IsValidSymbolName(layerName)
}

处于活动状态。文档只是一个助手类,如下所示:

使用_CadAPP=Autodesk.AutoCAD.ApplicationServices.Application

公共静态类处于活动状态
{
公共静态文档文档
{
获取{return_CadAPP.DocumentManager.MdiActiveDocument;}
}
}
..

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

14

主题

275

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
331
发表于 2020-6-1 16:29:08 | 显示全部楼层
是从LayerTable[layerName]还是LayerTableRecord中获取ObjectId?那么就不需要GetObject函数了。
回复

使用道具 举报

14

主题

275

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
331
发表于 2020-6-1 16:30:32 | 显示全部楼层
和提示,被删除的图层将一直存在,直到图形关闭。你不检查那个。
回复

使用道具 举报

14

主题

275

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
331
发表于 2020-6-1 16:34:51 | 显示全部楼层
您可以将所有内容包装在 Try-Catch 中,以便读取 System.Exception 值。这在很多情况下都是有道理的。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2020-6-1 18:08:49 | 显示全部楼层
正如gile在你的链接中提到的(引用他的话比改写他的话更容易)
你可以让VS找到所有对方法的引用,但是让你测试所有调用它的地方,可能是不同的上下文。
回复

使用道具 举报

14

主题

275

帖子

6

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
331
发表于 2020-6-1 21:11:13 | 显示全部楼层
感谢您的回复,代码是从命令调用中调用的,这是我捕获错误并报告它的地方。我当然应该在原来的帖子中包括这一点.[CommandMethod(“IR_AssignDripFlows”)]。
public static void AssignDripFlowsToBlocks()。
{。
尝试。
{。
DripFactory.AssignDripFlows();。
}。
捕获(异常 e)。
{。
AID_Application.HandleError(e);。
}。
}catch 中的 Exception 是 Autodesk.AutoCad.Runtime.Exception,如果我将其更改为系统,异常,在跟踪问题方面,我能否获得更好的数据?@huiz,感谢您指出仍在数据库中的已删除图层,我必须将其添加到函数中,我在其他一些函数中也收到了eInvalidContext错误,它似乎是在提交事务之后,这个层功能就是一个例子,我试图理解是什么导致了eInvalidContext,以及如何以不同的方式构建我的代码。
回复

使用道具 举报

4

主题

219

帖子

4

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
238
发表于 2020-6-2 03:30:55 | 显示全部楼层
嗯,奇怪。我只能找到一些关于eInvalidContext的信息,它指的是事务驻留对象或另一个数据库。我不能重现这个错误。
此外,我注意到Has()函数不返回已删除的层,而我很确定它过去会返回。所以我想你不用再检查被删除的图层了。
我从不使用Autodesk运行时异常,但总是使用System.Exception。后者是所有异常的母体。我知道你可以捕捉几个异常类型,并根据那个异常做事情,但是由于懒惰,我更喜欢一个捕捉所有。我不知道在这种情况下你是否得到了更好的描述,你可以试试看会发生什么。
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2020-6-2 09:28:03 | 显示全部楼层

你说MakeLayer()方法
回复

使用道具 举报

0

主题

9

帖子

1

银币

初来乍到

Rank: 1

铜币
9
发表于 2020-6-2 11:35:54 | 显示全部楼层
是的,MakeLayer是从AssignDripFlowsToBlocks函数调用的。在我的代码中,它也被称为一堆其他地方。我根本无法复制错误,我从未在我的机器上看到过。我在BricsCAD和AutoCAD中进行了尝试
<br>在堆栈顶部,当我得到错误时,让我觉得我在对象和事务上做错了什么。但代码似乎99%的时间运行正常。我查看了事务代码结构,但没有看到任何内容。我不会将事务作为参数或类似的东西传递
是否有一些资源可以让我更好地理解错误,或者在什么情况下抛出错误
回复

使用道具 举报

85

主题

404

帖子

7

银币

中流砥柱

Rank: 25

铜币
751
发表于 2020-6-2 18:34:14 | 显示全部楼层
尝试移除此块:使用(Active。Document.LockDocument())
如果在文档上下文中执行该命令,则不需要使用它:https://adndevblog . typepad . com/AutoCAD/2012/05/when-to-lock-the-document . html
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-4 03:44 , Processed in 0.230283 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表