Вопрос по exception, .net – StackOverflowException в .NET

13

После нескольких исключений StackOverflowException в .NET я заметил, что они полностью обходят необработанные обработчики исключений, которые предлагает .NET (Application.ThreadException / AppDomain.UnhandledException). Это очень тревожно, так как у нас есть критический код очистки в этих обработчиках исключений.

Есть ли способ преодолеть это?

Ваш Ответ

4   ответа
25

чение ThreadAbortException, OutOfMemoryException и упомянутое StackOverflowException. Эти исключения разрешены в любой инструкции в вашем коде.

И также есть способ их преодоления:

Самым простым является исключение ThreadAbortException. Когда текущий код выполняется в блоке finally. Исключения ThreadAbort являются своего рода "перемещенными" до конца блока finally. Таким образом, все в блоке finally не может быть прервано исключением ThreadAbortException.

Чтобы избежать OutOfMemoryException, у вас есть только одна возможность: ничего не размещать в куче. Это означает, что вам не разрешено создавать какие-либо новые ссылочные типы.

Чтобы преодолеть StackOverflowException, вам нужна помощь со стороны Framework. Эта помощь проявляется в регионах с ограниченным исполнением. Требуемый стек выделенbefore фактический код выполняется и дополнительно также гарантирует, что код уже JIT-скомпилирован и поэтому доступен для исполнения.

Существует три формы для выполнения кода в областях ограниченного выполнения (скопированы изБлог команды BCL):

ExecuteCodeWithGuaranteedCleanup, a stack-overflow safe form of a try/finally. A try/finally block preceded immediately by a call to RuntimeHelpers.PrepareConstrainedRegions. The try block is not constrained, but all catch, finally, and fault blocks for that try are. As a critical finalizer - any subclass of CriticalFinalizerObject has a finalizer that is eagerly prepared before an instance of the object is allocated. A special case is SafeHandle's ReleaseHandle method, a virtual method that is eagerly prepared before the subclass is allocated, and called from SafeHandle's critical finalizer.

Вы можете найти больше в этих сообщениях в блоге:

Области ограниченного исполнения и другие ошибки [Брайан Грюнкемейер] в блоге команды BCL.

Блог Джо Даффи оАтомарность и ошибки асинхронных исключений где он дает очень хороший обзор асинхронных исключений и надежности в .net Framework.

Error: User Rate Limit Exceeded
1

что вы можете просто восстановить, так как он не может выделить больше стековой памяти даже для вызова вашего обработчика исключений.

Единственное, что вы действительно можете сделать, это отследить причину и вообще предотвратить ее возникновение (например, быть осторожным с рекурсией и не размещать большие объекты в стеке).

18

переполнение стека или исключение нехватки памяти в самой CLR означает, что что-то пошло не так (я обычно получаю это, когда я был тупицей и создал рекурсивное свойство).

Когда возникает это состояние, CLR не может выделить новые вызовы функций или память, чтобы он мог вызывать обработчики исключений; это "мы" должны остановитьnow& Quot; сценарий.

Однако, если вы выбросите исключение самостоятельно, будут вызваны ваши обработчики исключений.

Error: User Rate Limit Exceeded adams
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
1

выше. Dumbass рекурсивное свойство, как он любит это называть. На самом деле просто проблема с набором кода слишком быстро.

private Thing _myThing = null;

Public Thing MyThing
{
   get{
        return this.MyThing;}
   set{
        this.MyThing = value;}
}
Error: User Rate Limit Exceeded

Похожие вопросы