Я бы хотел, чтобы оболочка выдавала исключение, включающее захваченную информацию трассировки стека из компонента. Я бы хотел, чтобы это выглядело так, как будто исключение было создано на исходном месте ошибки, даже если оно было создано в другом месте. Более конкретно, мне бы хотелось, чтобы трассировка стека, отображаемая средством выполнения тестов Visual Studio, отражала правильное местоположение.
Есть ли какой-нибудь способ сделать это? Также было бы неплохо, если бы я мог избежать трюков с низкоуровневым отражением при доступе к частным членам, но я возьму то, что смогу.
Меня не волнует, как захватить трассировку стека, Меня беспокоит прикрепление уже записанной трассировки стека к исключению.
Я попытался переопределить свойство StackTrace, но Visual Studio извлекает данные трассировки стека откуда-то еще, и кажется, игнорирует переопределенное свойство полностью
Код: Выделить всё
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;
}
}
}
CustomException: возникло исключение типа CustomException.
ExceptionDispatchInfo также ищет данные трассировки стека из частного свойства и поэтому не может найти какие-либо из этих данных, и когда вы выбросить это пользовательское исключение, к исключению прикрепляется новая трассировка стека с указанием места, из которого оно было создано. Если вы используете throw напрямую, информация о личном стеке устанавливается в место, где произошел бросок.
Подробнее здесь: https://stackoverflow.com/questions/370 ... -sharp-net