追逐和理解eInvalidContext..
我正试图找出一个eInvalidContext错误。不幸的是,我不能在我的开发机器上复制它,我只有错误报告可以处理。我怀疑这与基于我有限的网络搜索结果完成交易有关该错误似乎是在提交事务后由我的代码引起的(下面第39行)。使用OpenCloseTransaction可能会解决这个问题,但我不确定它是否会解决,我想更好地了解发生了什么。我必须承认,我甚至不了解这段代码中的
上下文是什么。
这里有人能解释为什么会发生eInvalidError吗?
我错误报告中的堆栈跟踪是
moduleAutodesk.AutoCAD.DatabaseServices.Transaction
context-lineVoid DeleteUnmanagedObject()
moduleAutodesk.AutoCAD.Runtime.DisposableWrapper
context-lineVoid !DisposableWrapper()
moduleAutodesk.AutoCAD.Runtime.DisposableWrapper
context-lineVoid Dispose(Boolean)
moduleAutodesk.AutoCAD.Runtime.DisposableWrapper
context-lineVoid Dispose()
moduleAID.CAD_Utility.Layers
context-lineBoolean MakeLayer(System.String, Int16, Boolean)
对于上下文,代码是通过命令调用调用的,我在命令调用中捕获错误并报告它
公共静态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,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;}
}
}
..
**** Hidden Message ***** 是从LayerTable还是LayerTableRecord中获取ObjectId?那么就不需要GetObject函数了。 和提示,被删除的图层将一直存在,直到图形关闭。你不检查那个。 您可以将所有内容包装在 Try-Catch 中,以便读取 System.Exception 值。这在很多情况下都是有道理的。
正如gile在你的链接中提到的(引用他的话比改写他的话更容易)
你可以让VS找到所有对方法的引用,但是让你测试所有调用它的地方,可能是不同的上下文。
感谢您的回复,代码是从命令调用中调用的,这是我捕获错误并报告它的地方。我当然应该在原来的帖子中包括这一点.。
public static void AssignDripFlowsToBlocks()。
{。
尝试。
{。
DripFactory.AssignDripFlows();。
}。
捕获(异常 e)。
{。
AID_Application.HandleError(e);。
}。
}catch 中的 Exception 是 Autodesk.AutoCad.Runtime.Exception,如果我将其更改为系统,异常,在跟踪问题方面,我能否获得更好的数据?@huiz,感谢您指出仍在数据库中的已删除图层,我必须将其添加到函数中,我在其他一些函数中也收到了eInvalidContext错误,它似乎是在提交事务之后,这个层功能就是一个例子,我试图理解是什么导致了eInvalidContext,以及如何以不同的方式构建我的代码。
嗯,奇怪。我只能找到一些关于eInvalidContext的信息,它指的是事务驻留对象或另一个数据库。我不能重现这个错误。
此外,我注意到Has()函数不返回已删除的层,而我很确定它过去会返回。所以我想你不用再检查被删除的图层了。
我从不使用Autodesk运行时异常,但总是使用System.Exception。后者是所有异常的母体。我知道你可以捕捉几个异常类型,并根据那个异常做事情,但是由于懒惰,我更喜欢一个捕捉所有。我不知道在这种情况下你是否得到了更好的描述,你可以试试看会发生什么。
你说MakeLayer()方法 是的,MakeLayer是从AssignDripFlowsToBlocks函数调用的。在我的代码中,它也被称为一堆其他地方。我根本无法复制错误,我从未在我的机器上看到过。我在BricsCAD和AutoCAD中进行了尝试
<br>在堆栈顶部,当我得到错误时,让我觉得我在对象和事务上做错了什么。但代码似乎99%的时间运行正常。我查看了事务代码结构,但没有看到任何内容。我不会将事务作为参数或类似的东西传递
是否有一些资源可以让我更好地理解错误,或者在什么情况下抛出错误
尝试移除此块:使用(Active。Document.LockDocument())
如果在文档上下文中执行该命令,则不需要使用它:https://adndevblog . typepad . com/AutoCAD/2012/05/when-to-lock-the-document . html
页:
[1]
2