Я хотел бы иметь функцию, которая, когда ему дается исключение, извлекает всю информацию об этом исключении и затем записывает ее в базу данных.
Перед переходом на .NET Core 2,Я смог сделать это следующим образом:
var details = new ErrorDetails();
if (ex == null) return details;
var st = new StackTrace(ex, true);
var frames = st.GetFrames();
if (frames != null && frames.Length > 0)
{
var errorDetails = frames.Select(frame => new ErrorDetails
{
FileName = frame.GetFileName(),
LineNumber = frame.GetFileLineNumber().ToString(),
MethodName = frame.GetMethod().Name,
ClassName = frame.GetMethod().DeclaringType.FullName
});
return errorDetails.FirstOrDefault();
}
return details;
С тех пор, как мой проект переключился на .NET Core 2, этот код возвращается с большей частью этой информации, равной null / default;Я посмотрел на кадры, которые я извлекаю, и у них больше нет информации.Для таких вещей, как FileName
и LineNumber
, значения равны нулю.Для таких вещей, как MethodName
и ClassName
, это значение есть, но оно неправильное.
Я бы разбил свой проект с помощью такого кода:
public class TestController : Controller
{
[HttpGet]
[AllowAnonymous]
public string ErrorHandling()
{
var a = int.Parse("fail parsing on purpose");
return a.ToString();
}
}
Значение для MethodName
в итоге получается StringToNumber
и для ClassName
это System.Number
Я не могу найти в Интернете никакой информации о том, почему это так и как я могу получить информацию об исключении.
РЕДАКТИРОВАТЬ:
Я подумал, что было бы также полезно перечислить, как я обрабатываю исключения.Я написал собственный обработчик исключений ошибок промежуточного программного обеспечения, очень похожий на тот, что описан в этом сообщении SO:
https://stackoverflow.com/a/48625298/2371128
РЕДАКТИРОВАТЬ 2: Это выполняется в режиме отладки.