C# Visio页面按名称查找形状,无例外

C# Visio页面按名称查找形状,无例外,c#,visio,shape,comexception,C#,Visio,Shape,Comexception,在Visio VBA(或COM API)中 当找不到形状名称时,如何获取形状而不期望出现异常 。。。在我的visio页面中,可能有也可能没有名为“DraftText”的矩形 我想检查它是否在那里,如果是,请执行smth 我的代码似乎是: Shape waterMarkRect = page.Shapes["DraftText"]; if (waterMarkRect == null) { waterMarkRect = page.DrawRectangle(0, 0, 50, 15);

在Visio VBA(或COM API)中

当找不到形状名称时,如何获取形状而不期望出现异常

。。。在我的visio页面中,可能有也可能没有名为“DraftText”的矩形

我想检查它是否在那里,如果是,请执行smth

我的代码似乎是:

Shape waterMarkRect = page.Shapes["DraftText"];
if (waterMarkRect == null)
{
   waterMarkRect = page.DrawRectangle(0, 0, 50, 15);
   waterMarkRect.Name = "DraftText";
   waterMarkRect.NameU = waterMarkRect.Name;
   waterMarkRect.Text = "INCONSISTANT";

   Layer wMarkLayer = page.Layers["WMark"] ?? page.Layers.Add("WMark");
   wMarkLayer.Add(waterMarkRect, 0);
}
...
...
问题是,如果形状“DraftText”不存在,我会得到一个COM异常

由于我反对使用try-catch块作为编码工具

我正在寻找一种在使用之前检查形状是否存在的方法,例如IDictionary.TryGetValue(,out)

或者如果(page.Shapes.Contain(“DraftText”)


有什么想法吗?

通过VBA执行此操作时,我只需在尝试按名称获取形状之前执行“错误恢复下一步”,然后在出现错误时转到PROC\u ERR以恢复错误处理

如果不能禁用异常,可以在每个形状上循环,并将其名称与要查找的形状进行比较。但是,与内置的按名称查找相比,执行此操作需要更长的时间。

使用try-catch块

Shape waterMarkRect = null;
try { 
    waterMarkRect = page.Shapes["DraftText"];
}
catch (Exception){
}

if (waterMarkRect == null)
{
   waterMarkRect = page.DrawRectangle(0, 0, 50, 15);
   waterMarkRect.Name = "DraftText";
   waterMarkRect.NameU = waterMarkRect.Name;
   waterMarkRect.Text = "INCONSISTANT";

   Layer wMarkLayer = page.Layers["WMark"] ?? page.Layers.Add("WMark");
   wMarkLayer.Add(waterMarkRect, 0);
}

On Error与try{}catch(){}相同。我试图避免任何必要的手段是不好的做法。评级是一种选择,我不喜欢,但如果什么都不可能的话,可能是。现在我将+1,如果没有适用的答案,我将V它:)感谢您的重播。我想这很可能是可能的,您可能需要添加一个检查,检查捕获了什么异常
catch(COMException ex){if(ex.ErrorCode!=0x00000)throw;}
,这样您就不会错过真正的异常