У меня вопрос: я пытаюсь пропустить некоторые стековые фреймы, которые поступают из библиотечного кода.Если я хочу проверить это, как мне лучше всего / проще всего вызвать ситуацию, когда на трассировке стека есть один или несколько кадров сверху, взятых из кода библиотеки?
Подробности:
Моя цель с помощью приведенного ниже кода состоит в том, чтобы иметь возможность регистрировать происхождение исключения в моем исходном коде.Тем не менее, в некоторых случаях исключение вызывается в коде библиотеки, поэтому я получаю трассировку стека, которая выглядит следующим образом:
System.Net.WebException: Время ожидания операции
в System.Net истекло.HttpWebRequest.GetRequestStream (TransportContext & context)
в System.Net.HttpWebRequest.GetRequestStream ()
в Microsoft.Bing.Platform.ConversationalUnderstanding.ObjectStore.ObjectStoreClientHelperClass` * *3e) (101) 7- Конец трассировки стека из предыдущего расположения, в котором было сгенерировано исключение ---
в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()
в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи)
в Microsoft.Bing.Platform.ConversationalUnderstanding.ObjectStore.ObjectStoreCoprocRequest.d__10`4.MoveNext ()
--- Конец трассировки стека из предыдущего местоположения, где было сгенерировано исключение ---
Итакв основном я хочу двигаться вниз по стековым фреймам, пока не доберусь до места, где у меня естьФактически полезная информация, пропуская методы библиотеки, которые действительно не говорят мне ничего полезного.
Вот код, который я хочу проверить:
public static (string Path, string Method, int Line) TryGetExceptionOrigin(this Exception e, string defaultPath, string defaultMethod, int defaultLine)
{
var defaultRes = (Path: defaultPath, Method: defaultMethod, Line: defaultLine);
var st = new StackTrace(e.GetInnerMostException(), true);
if (st.FrameCount == 0)
{
return defaultRes;
}
// Walk down the stack, ignoring framework code etc. with no useful information. We need a file name to be happy
for (int i = 0; i < st.FrameCount; i++)
{
var bottomFrame = st.GetFrame(i);
if (!(string.IsNullOrEmpty(bottomFrame.GetFileName())))
{
return (
Path: bottomFrame.GetFileName() ?? string.Empty, // Is null if no debug information
Method: bottomFrame.GetMethod().Name, // Documentation does not say this can ever be null
Line: bottomFrame.GetFileLineNumber()); // Is 0 if no debug information
}
}
// OK no match, we return the default information
return defaultRes;
}