У меня есть веб-приложение ASP MVC, и я пытаюсь настроить ведение журнала ошибок, где я пытаюсь отобразить дружественное к пользовательскому интерфейсу сообщение для Интернета и зарегистрировать более подробное сообщение в необходимой базе данных. Моему приложению может не потребоваться всегда регистрировать сообщение об ошибке в БД, но я хотел настроить пользовательское исключение таким образом, чтобы оно обрабатывало оба сценария.
Вот что у меня есть: CustomException: если подробное сообщение передано, получите новый guid, зарегистрируйте сообщение в БД и объедините значение guid в shortMessage.
public class CustomException : Exception
{
public CustomException(string message) : base(message)
{
}
public CustomException(string shortMessage, string detailMessage = "") : base(shortMessage)
{
if (!string.IsNullOrWhiteSpace(detailMessage))
{
string loggingId = Guid.NewGuid().ToString();
//code to log in DB with detail message
shortMessage = $"Reference# : {loggingId}. {shortMessage}";
}
}
}
Вспомогательный метод ThrowIf для проверки значения, чтобы код был чище, и мне не нужно делать проверку блока, как старую школу в веб-слое.
public static class ThrowIf
{
public static void IsZeroOrNegative(int argument, string shortMessage, string detailMessage = "")
{
if (argument <= 0)
{
throw new CustomException(shortMessage, detailMessage);
}
}
public static void IsNull(object argument, string shortMessage, string detailMessage = "")
{
if (argument == null)
{
throw CustomException.LogMessage(shortMessage, detailMessage);
}
}
}
Код веб-уровня: (пожалуйста, не спрашивайте, почему я не выбрасываю ArgumentException и не использую собственное CustomException в этом сценарии)
public ActionResult GetEmployee(int employeeId)
{
var responseViewModel = new EmployeeModel();
try
{
ThrowIf.IsZeroOrNegative(employeeId, shortMessage: "This is short message for UI.", detailMessage: "This is detail message for DB");
}
catch(CustomException ex)
{
ViewBag.Error = ex.Message();
}
return View(responseViewModel);
}
Проблема: Как вы можете видеть в моем коде CustomException, если я передаю значение для 'detailMessage', оно обновляет shortMessage текстом 'Reference..'. Теперь в веб-коде всякий раз, когда возникает ошибка, текст для ex.Message() не содержит текста «Ссылка...» и показывает только «Это короткое сообщение для пользовательского интерфейса» вместо «Ссылка#: [значение guid] . Это короткое сообщение для пользовательского интерфейса.
Кто-нибудь знает, почему ex.Message не отображает обновленный текст, когда ошибка возникает на веб-слое?
Вы можете присвоить значение короткого сообщения частной переменной в классе и переопределить свойство сообщения, чтобы оно возвращало значение частной переменной.
@Matt.G лол .. такая глупая ошибка. спасибо, теперь я заработал, используя приватную переменную. :)
@ Matt.G Я думаю, что использование частной переменной имеет один недостаток. поскольку его нужно передать в базу, он должен быть статическим. И когда происходит первая ошибка, он не возвращает фактическое сообщение об ошибке, другие вызовы после этого работают нормально. частная статическая строка _errorMessage = string.Empty; public CustomException(string shortMessage, string detailMessage = "") : base(_errorMessage) {_errorMessage = ....} я думаю, что вместо того, чтобы присваивать значение частной переменной, присваивание значения новому строковому свойству и доступ к этому свойству работали лучше.
поскольку вы переопределяете свойство Message, вам не нужно передавать значение конструктору базового класса.





вы присваиваете значение переменной shortMessage в конструкторе. и ожидание, что свойство Message класса Exception будет иметь значение shortmessage