我试图理解部署的应用程序无法正常运行的原因。我已经将问题归结为特定的更新例程。可悲的是,这个例程被嵌入到一个无用的尝试中。
bool requireUpdate = false;
try
{
requireUpdate = !client.IsUpToDate();
}
catch{ }
我需要一种方法来获取异常而无需重新编译并进行部署。
是否有办法修改app.config
文件,以便它可以跟踪所有处理的异常到日志文件,无论它们是如何处理的?
答案 0 :(得分:1)
不幸的是,处理异常没有任何办法,因为他们 处理(即使非常糟糕,如你的情况)。
获取它们的最佳方法是重写/重新编译/部署。
答案 1 :(得分:1)
<强>已更新强>
CLR分析可以帮助你!
看看这个链接: http://msdn.microsoft.com/en-us/magazine/cc301839.aspx
您基本上可以跟踪例外情况:
“他分析API提供了一组广泛的回调,详细描述了异常处理周期的搜索,展开和最后阶段。一个有趣的分析场景将监视托管异常并提供其他信息,例如抛出的Win32线程异常,堆栈顶部的函数,该函数的参数,以及异常发生点范围内的本地化。“
答案 2 :(得分:1)
使用低级调试器,例如WinDbg,您将能够知道第一次机会异常。
答案 3 :(得分:1)
仅仅因为我今天发现了这一点(而且我真的很喜欢用不太有用的答案来复活旧问题!),因为.NET4,AppDomain
上有一个新事件,它会在任何异常处理之前触发。
在应用的设置代码中的某个时刻(例如Program.Main
,Application_OnStart
等),您可以添加处理程序:
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.FirstChanceException
+= FirstChanceException
// ...rest of your app startup
}
private static bool LogFirstChanceExceptions
{
get
{
return ConfigurationManager.AppSettings["logFirstChanceExceptions"]
.Equals(bool.TrueString)
}
}
private static void FirstChanceException(object sender,
FirstChanceExceptionEventArgs e)
{
if (e != null &&
e.Exception != null &&
LogFirstChanceExceptions)
{
Console.Error.WriteLine("First-chance {0}: {1}",
e.Exception.GetType(),
e.Exception.Message);
}
}
}
(未经测试,无保修等。未图示:任何重新处理,以防FirstChanceException
处理程序本身抛出异常)
无法帮助OP,但它可能会帮助那些可以重新编译的人,包含一些允许他们在将来切换此类跟踪的内容。
答案 4 :(得分:0)
我在Java中使用过的技巧:
浏览应用程序中的所有catch块,查找空的块。向块添加调试或跟踪消息,例如“捕获预期的异常”和异常。无论如何你应该拥有这个,并制定一个政策,默默地吞下异常是绝对不可接受的。
如果无法清除异常,请重新编译基本异常,如果应用程序处于调试(或跟踪)模式,则向no-arg构造函数添加一个块以记录堆栈跟踪。显然,如果您的应用程序/库有自己的Exception层次结构,这样做会更容易,但是有一些方法可以注入这种行为(这里用C#执行此操作的方式与我完成此操作的方式不同)
答案 5 :(得分:0)
还有另一种选择,但它可能也可能不漂亮:Moles。
技术上用于单元测试, Moles允许您用委托替换任何.NET方法。您可以使用它来替换那个代替您执行所需操作的方法。
您可以使用调用client.IsUpToDate()的委托替换原始方法,以便您可以阻止异常吗?
Moles是Pex的一部分: http://research.microsoft.com/en-us/projects/pex/default.aspx
答案 6 :(得分:-2)
这solution可能就是你要找的 基本上,该指令是使用这段代码:
System.Diagnostics.EventLog.WriteEntry(“MyEventSource”,exception.StackTrace,
System.Diagnostics.EventLogEntryType.Warning);
另外,来自同一链接的app.config似乎是这样的:
<system.diagnostics>
<switches>
<add name="MySwitch" value="Verbose" />
</switches>
<trace autoflush="true">
<listeners>
<add name="EventLogger"
type="System.Diagnostics.EventLogTraceListener"
initializeData="NameOfYourApplication" />
</listeners>
</trace>