我正在使用针对C#的ANTLR解析器库开发一个项目.我已经构建了一个语法来解析一些文本,它运行良好.但是,当解析器遇到非法或意外的令牌时,它会抛出许多异常中的一个.问题是在某些情况下(并非所有)我的try/catch块不会捕获它而是将执行作为未处理的异常停止.
问题在于我无法在其他任何地方复制此问题,而是在我的完整代码中.调用堆栈显示异常肯定发生在我的try/catch(Exception)块中.我唯一能想到的是,在我的代码和引发异常的代码之间发生了一些ANTLR程序集调用,而且这个库没有启用调试,所以我无法单步执行它.我想知道不可调试的程序集是否会抑制异常冒泡?调用堆栈看起来像这样; 外部程序集调用在Antlr.Runtime中:
Expl.Itinerary.dll!TimeDefLexer.mTokens() Line 1213 C#
Antlr3.Runtime.dll!Antlr.Runtime.Lexer.NextToken() + 0xfc bytes
Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.FillBuffer() + 0x22c bytes
Antlr3.Runtime.dll!Antlr.Runtime.CommonTokenStream.LT(int k = 1) + 0x68 bytes
Expl.Itinerary.dll!TimeDefParser.prog() Line 109 + 0x17 bytes C#
Expl.Itinerary.dll!Expl.Itinerary.TDLParser.Parse(string Text = "", Expl.Itinerary.IItinerary Itinerary = {Expl.Itinerary.MemoryItinerary}) Line 17 + 0xa bytes C#
Parse()中最底部调用的代码片段如下所示:
try {
// Execution stopped at parser.prog()
TimeDefParser.prog_return prog_ret = parser.prog();
return prog_ret == null ? null : prog_ret.value;
}
catch (Exception ex) {
throw new ParserException(ex.Message, ex);
}
Run Code Online (Sandbox Code Playgroud)
对我来说,一个catch(Exception)子句应该捕获任何异常.有什么理由不这样做吗?
更新:我使用Reflector跟踪外部组件,没有发现任何线程的证据.该程序集似乎只是ANTLR生成的代码的运行时实用程序类.引发的异常来自TimeDefLexer.mTokens()方法,其类型为NoViableAltException,它派生自RecognitionException - > …
Dictionary<TKey, TValue>在mscorlib.dll中浏览泛型类的实现时,我注意到以下用了很多次来获取哈希键:
int num = this.comparer.GetHashCode(key) & int.MaxValue;
Run Code Online (Sandbox Code Playgroud)
GetHashCode()返回一个int.我错误地认为int.MaxValue和任何整数x之间的按位AND 将始终返回x?
有人可以解释为什么以上述方式使用&运算符?
我有许多大型KML数据集,它们使用基于区域的网络链接层次结构来提供服务; 如KML参考中所述:
将Regions与NetworkLinks结合使用,可以创建指针层次结构,每个指针指向一个特定的子区域.如
<viewRefreshMode>以下KML文件所示,具有onRegion选项,该选项指定仅在Region处于活动状态时加载Region数据.如果为嵌套区域提供多个详细级别,则仅当用户的视点触发下一个加载时才会加载更大量的数据.
这在Google地球中加载时效果很好.
我现在希望使用Google Earth插件在应用程序中加载这些内容. 我需要通过Google Earth API访问加载的内容 ; (即附加单击事件,更改样式)以将内容集成到应用程序中.
问题是,我没有找到任何关于网络链接的"有载"事件的参考.在我看来,这将起作用的方式是:
我认为javascript看起来像下面这样.
请注意:这只是一个草图,可能有助于理解我的问题. 我不是问为什么这段代码不起作用.
//create network link
var networkLink = ge.createNetworkLink("");
networkLink.setName("Regionated hierarchy root");
// create a Link object
//the network-links contained in the kml that will be returned in this file
//are region-based; they will only be loaded when the user zooms into the relevant
//region.
var link = ge.createLink("");
link.setHref("http://foo.com/regionatedRoot.kml");
// attach the Link to the …Run Code Online (Sandbox Code Playgroud) 我们将 .NET API 用于 IBM 的 WebSphere MQ。
创建 MQQueueManager 对象显然是一项昂贵的操作,因此我们缓存并重用这些对象的池。
目前,对于每个请求,我们访问所需的队列:
//obtain queueManager from pool
IBM.WMQ.MQQueue requestQ= queueManager.AccessQueue(requestQName, mqOptions);
IBM.WMQ.MQQueue responseQ= queueManager.AccessQueue(responseQName, mqOptions);
Run Code Online (Sandbox Code Playgroud)
完成后关闭它们:
requestQ.Close();
responseQ.Close();
Run Code Online (Sandbox Code Playgroud)
这是最佳实践,还是我们也应该池化和重用 MQQueue 对象(除了队列管理器)?AccessQueue() 似乎是客户端上的廉价操作。
我在StackOverflow上有类似的帖子,但也许我的误解更为重要.我有一个动作索引()和索引视图的渲染.从Index()视图取决于单击的按钮[HttpPost]索引()或[HttpPost] Search()必须被调用因为我发布了一些数据.发布到不同操作的唯一方法是使用jQuery吗?如果jQuery是唯一的方法,如果我的操作返回视图(完整的Html页面),我必须从$ .post清理整个文档元素并用我的视图html填充它?我对这一切都很陌生,非常感谢!
@using (Html.BeginForm())
{
<input name="startDate" type="text" size="20" class="inputfield" id="datepicker" />
<a href="#" id="apply_button">...</a>
<a href="#" id="go_button">...</a>
}
public ActionResult Index(string lang)
{
return View();
}
//Perhaps this action is needed
[HttpPost]
public ActionResult Index(string lang, string startDate)
{
return View();
}
[HttpPost]
public ActionResult Search(string lang, string startDate)
{
return View();
]
Run Code Online (Sandbox Code Playgroud) .net ×3
c# ×2
antlr ×1
asp.net-mvc ×1
exception ×1
ibm-mq ×1
javascript ×1
jquery ×1
kml ×1
posting ×1