Я читал о Функциях Надежности в.NET и записал следующий класс для исследования ExecuteCodeWithGuaranteedCleanup
class Failing
{
public void Fail()
{
RuntimeHelpers.PrepareConstrainedRegions();
try
{
}
finally
{
RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(Code, Cleanup, "fail");
}
}
private void Code(object message)
{
// Some code in here that will cause an exception...
}
private void Cleanup(object message, bool something)
{
Console.WriteLine(message);
Console.ReadLine();
}
}
Я экспериментировал со множеством тел кода для Code
метод. Они и их результаты во время выполнения упоминаются ниже
Порождение OutOfMemoryException
- Cleanup
не становится названным
List ss = new List();
while (true)
{
string s = new string('x', 1000000);
ss.Add(s);
}
Порождение a StackOverflowException
- Cleanup
не становится названным
Code(message); // recursive call
Порождение a ExecutionEngineException
- Cleanup
не становится названным
Environment.FailFast(message.ToString());
Порождение a ThreadAbortException
- Cleanup
действительно становится названным (однако постоянный клиент try...finally
может также поймать это исключение),
Thread.CurrentThread.Abort();
Таким образом, вопросы
ExecuteCodeWithGuaranteedCleanup
правильно?ExecuteCodeWithGuaranteedCleanup
на самом деле полезный?