我正在使用针对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 - > …
我正在编写一个脚本来开始使用PowerShell.我正在尝试转换一个工作的VBScript脚本,该脚本枚举远程Windows计算机上的映射网络驱动器.
其中一项任务是使用远程WMI来读取注册表并找到explorer.exe的进程所有者,以确定谁登录.这个指南似乎很容易.
但是,我需要调用的WMI方法是来自Win32_Process的GetOwner(),它需要两个输出参数来存储其返回值.
如何调用带输出参数的方法?当我尝试给它两个字符串时,我得到错误:Cannot find an overload for "GetOwner" and the argument count: "2".
.MSDN页面说有两个参数,所以我不确定我做错了什么.
似乎.NET Regex.Replace方法自动替换所有匹配的事件.我可以提供一个MatchEvaluator委托,它在第一次替换后返回匹配的字符串,不会发生任何变化,但这对我来说效率非常低.
第一次更换后停止的最有效方法是什么?
在.NET 2.0程序集中调用代码的.NET 4.0程序集是否存在兼容性障碍?反之亦然?
更具体地说,我在研究使用基于.NET 2.0的第三方应用程序时对Visual Studio 2010的升级.该应用程序可以通过引用我的自定义代码的钩子进行扩展.反之亦然,我的代码将引用应用程序的程序集.
我在目标文件(例如)上运行GDB,我想根据几个命令检查它.如何根据文件中的行执行这些命令(而不是输入每个运行的GDN)?exeFile
例如 - 我想设置中断 -
break *0x8048e19
break *0x8048e32
break *0x8048e6f
break *0x8048e90
Run Code Online (Sandbox Code Playgroud)
所以我想将它们保存在一个文件中然后告诉GDB从这个文件中执行它们.
关于ScriptResource.axd,我收到了一个无效的viewstate错误.只是想知道你是否有人可以帮助我.错误是:
2009-02-24 09:46:30,021 [13] DEBUG ASP.global_asax [(null)] - Request start - URL: /Web/ScriptResource.axd?d=E9hlvtsn8Gr1MyjysW1gFDFYr4CVwstY-sC22tRu5V8d7UyEYz3FhVYGrlhY87n2ihgKh58RrMRhK-Yk2WcQahEaCg_asTInqHK 2009-02-24 09:46:30,021 [13] DEBUG ASP.global_asax [(null)] - Application_AuthenticateRequest started 2009-02-24 09:46:30,021 [13] ERROR ASP.global_asax [(null)] - Unexpected error. User presented with Site Error page. System.Web.HttpException: Invalid viewstate. at System.Web.UI.Page.DecryptStringWithIV(String s, IVType ivType) at System.Web.UI.Page.DecryptString(String s) at System.Web.Handlers.ScriptResourceHandler.DecryptParameter(NameValueCollection queryString) at System.Web.Handlers.ScriptResourceHandler.ProcessRequestInternal(HttpResponse response, NameValueCollection queryString, VirtualFileReader fileReader) at System.Web.Handlers.ScriptResourceHandler.ProcessRequest(HttpContext context) at System.Web.Handlers.ScriptResourceHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext context) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
这发生在生产环境中.我无法在开发和测试环境中重现这一点.这些页面也只能由经过身份验证的用户访问.如果你能对这个问题有所了解,那将是真的.
我正在为应用程序创建一些自定义性能计数器.我写了一个简单的C#工具来创建类别和计数器.例如,下面的代码片段基本上就是我正在运行的代码片段.然后,我运行一个单独的应用程序,无休止地刷新计数器的原始值.当它运行时,计数器和虚拟实例在perfmon本地可见.
我遇到的问题是我们使用的监控系统无法看到我从另一台服务器远程查看时创建的多实例计数器中的实例.当使用perfmon浏览计数器时,我可以看到类别和计数器,但实例框显示为灰色,我甚至无法选择"所有实例",也无法单击"添加".使用其他访问方法,如[typeperf][1]
展示类似的问题.
我不确定这是服务器还是代码问题.这只能在我需要的生产环境中重现.在我的桌面和开发服务器上,它运行良好.我是所有服务器上的本地管理员.
CounterCreationDataCollection collection = new CounterCreationDataCollection();
var category_name = "My Application";
var counter_name = "My counter name";
CounterCreationData ccd = new CounterCreationData();
ccd.CounterType = PerformanceCounterType.RateOfCountsPerSecond64;
ccd.CounterName = counter_name;
ccd.CounterHelp = counter_name;
collection.Add(ccd);
PerformanceCounterCategory.Create(category_name, category_name, PerformanceCounterCategoryType.MultiInstance, collection);
Run Code Online (Sandbox Code Playgroud)
然后,在一个单独的应用程序中,我运行它来生成虚拟实例数据:
var pc = new PerformanceCounter(category_name, counter_name, instance_name, false);
while (true) {
pc.RawValue = 0;
Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud) 你能告诉我Expires和Cache-control的区别:max-age?
我希望在Windows Mobile项目上有日志时间戳.精度必须至少在100毫秒的范围内.
但是我的调用DateTime.Now
返回一个属性设置为零的DateTime
对象Millisecond
.该Ticks
物业也相应地四舍五入.
如何获得更好的时间准确度?
请记住,我的代码在Compact Framework 3.5版上运行.我使用的是HTC touch Pro 2设备.
基于MusiGenesis的答案,我创建了以下类来解决这个问题:
/// <summary>
/// A more precisely implementation of some DateTime properties on mobile devices.
/// </summary>
/// <devdoc>Tested on a HTC Touch Pro2.</devdoc>
public static class DateTimePrecisely
{
/// <summary>
/// Remembers the start time when this model was created.
/// </summary>
private static DateTime _start = DateTime.Now;
/// <summary>
/// Remembers the system uptime ticks when …
Run Code Online (Sandbox Code Playgroud) 假设我在Windows服务器上使用nant将部署脚本编写到文件共享:\\server\share
.我想要一个nant脚本从共享中删除所有文件,然后复制到新文件中.
我有这个代码删除文件,但我收到一个错误,它无法删除"\ server\share".但我不想删除共享,只删除其中的内容.
<delete>
<fileset basedir="\\server\share">
<include name="**/**" />
</fileset>
</delete>
Run Code Online (Sandbox Code Playgroud)
输出:
BUILD FAILED D:\code\xxx\xxx.deploy(177,8): Cannot delete directory '\\server\share'. Access to the path '\\server\share' is denied.
如果我修改它而不是删除共享中目录的内容,比如说\\server\share\somedir
,它会删除"somedir"而不会出错.但是,我仍然不想删除目录,只是内容.有办法吗?