Ответ 1
Используйте ex.ToString()
, чтобы получить полную трассировку стека.
Вы должны скомпилировать файлы отладки (файлы .pdb) даже в режиме выпуска, чтобы получить номера строк (это опция в свойствах сборки проекта).
Как отобразить номер строки, вызвавшей ошибку, и это возможно даже с тем, как .NET компилирует свои .exe?
Если не существует автоматизированного способа для Exception.Message, чтобы отобразить sub, который был удален?
try
{
int x = textbox1.Text;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
Используйте ex.ToString()
, чтобы получить полную трассировку стека.
Вы должны скомпилировать файлы отладки (файлы .pdb) даже в режиме выпуска, чтобы получить номера строк (это опция в свойствах сборки проекта).
Чтобы увидеть stacktrace для данного исключения, используйте e.StackTrace
Если вам нужна более подробная информация, вы можете использовать класс System.Diagnostics.StackTrace (вот какой код вы можете попробовать):
try
{
throw new Exception();
}
catch (Exception ex)
{
//Get a StackTrace object for the exception
StackTrace st = new StackTrace(ex, true);
//Get the first stack frame
StackFrame frame = st.GetFrame(0);
//Get the file name
string fileName = frame.GetFileName();
//Get the method name
string methodName = frame.GetMethod().Name;
//Get the line number from the stack frame
int line = frame.GetFileLineNumber();
//Get the column number
int col = frame.GetFileColumnNumber();
}
Это будет работать только в том случае, если для сборки имеется файл pdb. См. Вкладку "Свойства проекта" - вкладка "Создание" - "Дополнительно" - "Отладка информации", чтобы убедиться, что есть файл pdb.
Если вы используете 'StackTrace' и включаете файлы .pdb в рабочий каталог, трассировка стека должна содержать номера строк.
string lineNumber=e.StackTrace.Substring(e.StackTrace.Length - 7, 7);
таким образом, вы можете получить номер строки из исключения
public int GetLineNumber(Exception ex)
{
const string lineSearch = ":line ";
var index = ex.StackTrace.LastIndexOf(lineSearch);
int ln=0;
if (index != -1)
{
var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
string lnum = System.Text.RegularExpressions.Regex.Match(lineNumberText, @"\d+").Value;
int.TryParse(lnum,out ln);
}
return ln;
}