У меня есть компонент, который обрабатывает ошибки с использованием возвращаемых значений в отличие от стандартной обработки исключений. В дополнение к коду ошибки он также возвращает трассировку стека, где произошла ошибка. Обертка, которую я использую для вызова компонента, будет интерпретировать коды возврата и выдавать исключение.
Я хотел бы, чтобы оболочка выдавала исключение, которое включает в себя информацию о трассировке захваченного стека из компонента. Я бы хотел, чтобы это выглядело так, как если бы исключение было выброшено с исходного сайта ошибки, даже если оно было выброшено в другое место. Более конкретно, идентификатор, такой как трассировка стека, отображаемая визуальным студийным тестировщиком, чтобы отобразить правильное расположение
Есть ли способ сделать это? Было бы неплохо, если бы я мог избежать трюков с отражением на нижнем уровне, обращающихся к закрытым членам, но я возьму то, что могу получить.
РЕДАКТИРОВАТЬ 1: Я не заинтересован в том, как захватить трассировку стека, я заинтересован в прикреплении трассировки стека, которая уже была захвачена, в Exception
ИЗМЕНИТЬ 2:
Я попытался переопределить свойство StackTrace, но визуальная студия извлекает данные трассировки стека из другого места и, кажется, полностью игнорирует переопределенное свойство.
CustomException GenerateExcpetion()
{
return new CustomException();
}
void ThrowException(Exception ex)
{
Trace.WriteLine("Displaying Exception");
Trace.WriteLine(ex.ToString());
var edi = ExceptionDispatchInfo.Capture(ex);
edi.Throw();
}
[TestMethod]
public void Test006()
{
var ex = GenerateExcpetion();
ThrowException(ex);
}
public class CustomException : Exception
{
string _stackTrace;
public CustomException()
{
_stackTrace = Environment.StackTrace;
}
public override string StackTrace
{
get
{
return base.StackTrace;
}
}
}
Метод Excpetion.ToString() извлекает данные трассировки стека из частного свойства, и поэтому трассировка стека, исходящая из переопределения, не отображается.
CustomException: выбрано исключение типа "CustomException".
ExceptionDispatchInfo ищет данные трассировки стека из частного свойства, и поэтому он не может найти ни одну из этих данных, и когда вы бросаете это настраиваемое исключение, к исключению добавляется новая трассировка стека с местоположением, которое его отбрасывают. Если вы используете throw напрямую, информация о закрытом стеке устанавливается в место, где произошел выброс.