Прикрепите StackTrace к исключению без использования C#/.NET ⇐ C#

Место общения программистов C#
Anonymous
Прикрепите StackTrace к исключению без использования C#/.NET

Сообщение Anonymous »

У меня есть компонент, который обрабатывает ошибки, используя возвращаемые значения, а не стандартную обработку исключений. Помимо кода ошибки, он также возвращает трассировку стека, показывающую, где произошла ошибка. Оболочка, которую я использую для вызова компонента, интерпретирует коды возврата и выдает исключение.
Я бы хотел, чтобы оболочка выдавала исключение, включающее захваченную информацию трассировки стека из компонента. Я бы хотел, чтобы это выглядело так, как будто исключение было создано на исходном месте ошибки, даже если оно было создано в другом месте. Более конкретно, мне бы хотелось, чтобы трассировка стека, отображаемая средством выполнения тестов 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;
}
}
}
Метод Exception.ToString() извлекает данные трассировки стека из частного свойства, поэтому трассировка стека, полученная в результате переопределения, не отображается.
CustomException: возникло исключение типа CustomException.
ExceptionDispatchInfo также ищет данные трассировки стека из частного свойства и поэтому не может найти какие-либо из этих данных, и когда вы выбросить это пользовательское исключение, к исключению прикрепляется новая трассировка стека с указанием места, из которого оно было создано. Если вы используете throw напрямую, информация о личном стеке устанавливается в место, где произошел бросок.

Подробнее здесь: https://stackoverflow.com/questions/370 ... -sharp-net

Вернуться в «C#»