Могу ли я получить строку кода, которая вызвала исключение?
-
03-07-2019 - |
Вопрос
Помимо чтения GetFileName()
файл и чтение в строку GetFileLineNumber()
из стекового фрейма из
new StackTrace(exception).GetFrame(x)
есть ли способ получить фактическую строку кода (в виде строки), которая вызвала исключение?
Спасибо
Другие советы
Я так не думаю.Код скомпилирован, поэтому он больше не доступен.Однако, если вы также если исходный код доступен, может быть несколько обходных путей.
Нет, это твой единственный вариант, насколько я знаю.Чтобы получить исходную строку кода, которая вызвала исключение, необходимо иметь доступный исходный код.Что тот StackFrame
уже позволяет вам получить номер строки (через символы отладки - в большинстве случаев файл PDB), я бы сказал, делает это достаточно простым.
Есть ли какая-то конкретная проблема с предложенным вами методом?
Надежного способа сделать это не существует, поскольку информация о строке не хранится в DLL-файлах.Информация, которая отображает блоки IL в строки исходного кода, хранится в файле PDB.Вам нужно будет получить доступ к PDB, чтобы получить информацию о строке для исключения.
Существует достаточная информация о классе StackFrame, чтобы получить соответствующий класс ISymUnmanagedMethod, если доступна PDB.В основном вам просто нужен токен метода и текущее смещение в метод.Это требует, чтобы вы понимали внутреннюю структуру PDB, и я не уверен, задокументировано ли это где-нибудь.
PDB API - интерфейс: http://msdn.microsoft.com/en-us/library/ms233503.aspx
Он был бы скомпилирован, так что во время выполнения у вас был бы только IL.В лучшем случае вы могли бы получить IL и декомпилировать его обратно на C #, очень похоже на то, как это делает reflector.
Вы можете получить строку, используя try catch
блок:
catch(Exception exception) {
//exception.StackTrace at the first line has the line you are looking for
}