我得到一个递归调用一个抛出堆栈溢出异常的方法.第一个调用被try catch块包围,但没有捕获异常.
堆栈溢出异常是否以特殊方式运行?我可以正确捕获/处理异常吗?
注意:如果相关:
主线程中没有抛出异常
代码抛出异常的对象由Assembly.LoadFrom(...)手动加载.CreateInstance(...)
昨天我参加了关于SO专门讨论OutOfMemoryException以及处理它的优缺点的讨论(C#try {} catch {}).
我处理它的专业人士是:
但并非所有人都同意这一点,并推测在此异常之后未知的程序状态以及无法做一些有用的事情,因为它需要更多的内存.
因此我的问题是:没有处理OutOfMemoryException并在发生时立即放弃的严重原因是什么?
编辑:你认为OOME和ExecutionEngineException一样致命吗?
我们正在努力使用策略来正确处理应用程序中的异常.这是我们的目标(总结):
我们已经提出了一个涉及通用特定于应用程序特定异常的解决方案,并且在一段代码中就是这样的:
try {
// Do whatever
}
catch(ArgumentNullException ane)
{
// Handle, optinally log and continue
}
catch(AppSpecificException)
{
// Rethrow, don't log, don't do anything else
throw;
}
catch(Exception e)
{
// Log, encapsulate (so that it won't be logged again) and throw
Logger.Log("Really bad thing", e.Message, e);
throw new AppSpecificException(e)
}
Run Code Online (Sandbox Code Playgroud)
记录所有异常,然后转为AppSpecificException,以便不再记录它.最终它将到达最后的手段事件处理程序,如果必须,将处理它.
我对异常处理模式没有太多经验......这是解决我们目标的好方法吗?它有任何重大缺点或大红色警告吗?
注意:这样做的一个缺点是,在第一次捕获之后你将失去处理特定异常的能力(如果你调用一个调用另一个方法的方法而第二个抛出异常则你无法处理它)但是我发现我从来没有这样做过......我只处理一个深度的例外...
我有一些代码
try
{
result.FirstName = nodes[myIdx].Attributes["ows_FirstName"].Value;
} catch { }
Run Code Online (Sandbox Code Playgroud)
如果我正在寻找的属性存在(Good ol sharepoint),我现在不知道在调用此调用之前.
因此,我可以编写我想要创建的代码的唯一线性方式就是这样.
try
{
result.FirstName = nodes[myIdx].Attributes["ows_FirstName"].Value;
} catch { }
try
{
result.LastName = nodes[myIdx].Attributes["ows_LastName"].Value;
} catch { }
....
Run Code Online (Sandbox Code Playgroud)
现在我没有使用此代码的catch部分,最终得到了大量完全冗余的行.
为什么我不能这样做
try { result.FirstName = nodes[myIdx].Attributes["ows_FirstName"].Value; }
Run Code Online (Sandbox Code Playgroud)
那么为什么我们明确被迫声明一个catch块,即使它没有被处理?我确信有充分的理由,但无法解决.
编辑:在每个人开始对我说,吞下一个例外是不好的,等等等等等等.我们(和我)都知道这些论点,但在这个(和许多)现实世界场景中,没有什么特别的例外,我无法做(或需要做)来修复行为.