Почему высокая часть стека (в Exception.StackTrace) усекается? Рассмотрим простой пример:
public void ExternalMethod()
{
InternalMethod();
}
public void InternalMethod()
{
try
{
throw new Exception();
}
catch(Exception ex)
{
// ex.StackTrace here doesn't contain ExternalMethod()!
}
}
Кажется, что это "по дизайну". Но каковы причины такого странного дизайна? Это только делает отладку более сложной, потому что в сообщениях журнала я не могу понять, кто вызвал InternalMethod(), и часто эта информация очень нужна.
Что касается решений (для тех, кто не знает), я понимаю, что есть два общих решения:
1) Мы можем зарегистрировать статическое свойство Environment.StackTrace, которое содержит весь стек (например, начиная с уровня hiest (очередь сообщений) и заканчивая самым глубоким методом, в котором возникает исключение).
2) Мы должны улавливать и регистрировать исключения на самых высоких уровнях. Когда нам нужно перехватывать исключения на более низких уровнях, чтобы что-то сделать, нам нужно перебросить (с выражением "throw" в С#), чтобы он продвигался дальше.
Но вопрос о причинах такого дизайна.