相关疑难解决方法(0)

C#捕获堆栈溢出异常

我得到一个递归调用一个抛出堆栈溢出异常的方法.第一个调用被try catch块包围,但没有捕获异常.

堆栈溢出异常是否以特殊方式运行?我可以正确捕获/处理异常吗?

注意:如果相关:

  • 主线程中没有抛出异常

  • 代码抛出异常的对象由Assembly.LoadFrom(...)手动加载.CreateInstance(...)

c# stack-overflow try-catch

110
推荐指数
8
解决办法
9万
查看次数

什么时候可以捕获OutOfMemoryException以及如何处理它?

昨天我参加了关于SO专门讨论OutOfMemoryException以及处理它的优缺点的讨论(C#try {} catch {}).

我处理它的专业人士是:

  • 抛出OutOfMemoryException这一事实通常不意味着程序的状态已损坏;
  • 根据文档"下面的Microsoft中间(MSIL)指令抛出OutOfMemoryException:box,newarr,newobj"这只是(通常)意味着CLR试图找到给定大小的内存块并且无法做到这一点; 它意味着没有单字节留在我们的性格;

但并非所有人都同意这一点,并推测在此异常之后未知的程序状态以及无法做一些有用的事情,因为它需要更多的内存.

因此我的问题是:没有处理OutOfMemoryException并在发生时立即放弃的严重原因是什么?

编辑:你认为OOME和ExecutionEngineException一样致命吗?

.net c#

36
推荐指数
7
解决办法
2万
查看次数

处理异常,这是一个好方法吗?

我们正在努力使用策略来正确处理应用程序中的异常.这是我们的目标(总结):

  • 仅处理特定的例外情况.
  • 只处理您可以纠正的异常
  • 只记录一次.

我们已经提出了一个涉及通用特定于应用程序特定异常的解决方案,并且在一段代码中就是这样的:

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,以便不再记录它.最终它将到达最后的手段事件处理程序,如果必须,将处理它.

我对异常处理模式没有太多经验......这是解决我们目标的好方法吗?它有任何重大缺点或大红色警告吗?

注意:这样做的一个缺点是,在第一次捕获之后你将失去处理特定异常的能力(如果你调用一个调用另一个方法的方法而第二个抛出异常则你无法处理它)但是我发现我从来没有这样做过......我只处理一个深度的例外...

.net c# exception-handling

28
推荐指数
2
解决办法
1917
查看次数

为什么try块需要捕获

我有一些代码

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块,即使它没有被处理?我确信有充分的理由,但无法解决.

编辑:在每个人开始对我说,吞下一个例外是不好的,等等等等等等.我们(和我)都知道这些论点,但在这个(和许多)现实世界场景中,没有什么特别的例外,我无法做(或需要做)来修复行为.

c# syntax try-catch catch-block

5
推荐指数
2
解决办法
1424
查看次数