В моем текущем проекте я вижу много кода такого типа:
public User GetUserByName(string userName)
{
try
{
// Lots of code here to check if the user is in the cache,
// get it from the DB if not, set properties on it, etc...
}
catch (Exception ex)
{
throw new Exception("Exception getting user by name, username: " + userName, ex);
}
}
Я ценю намерение: наличие локальных переменных действительно полезно для отладки, но использование метода try / catch для каждого кажется слишком большой работой, и это действительно не помогает читабельности. , На данный момент я игнорирую тот факт, что мы генерируем исключение System.Exception, естественно, более конкретный тип был бы лучше, но это не главное в моем вопросе. Также, само собой разумеется, что это копируется и копируется без каких-либо изменений в сообщении об исключении ...
Итак, мой вопрос: как вы собираете такую контекстную информацию (например, имя пользователя в приведенном выше примере) для отладки? Предположим для целей вопроса, что метод хорошо написан в противном случае, и всякая специфическая проверка исключений выполняется, и все, что я хочу, это добавить контекст к любому исключению, которое не может быть обработано здесь. и должен подниматься до обработчиков верхнего уровня.
Мои первые мысли:
Опирайтесь на каркас ведения журнала, чтобы отследить каждый вызов метода с его параметрами, что опять-таки является эталонным и намного больше журналирования, чем необходимо для производства.
Введите некоторую AOP и перехватите каждый метод (или ограниченное подмножество), проверив наличие исключения при возврате и записав параметры или добавив их в выброшенное исключение.
Любые другие мнения приветствуются!