Обе ли записи эквивалентны? Можно ли второй случай комбинировать с catch? Если в ходе блока try происходит хотя бы одно исключение, то как правильно оформить общую обработку ошибок без перечисления всех возможных исключений? И ещё: если необходимо при выходе из функции сообщить о том, что обработка не удалась, как передать это корректнее?
Записи вообще не эквивалентны.
try->catch->finally универсален, using только для обьектов с реализованным интерфейсом IDisposable, просто сам вызовет Dispose, что бы не случилось.
Логично использовать using, когда это можно делать (обьект позволяет), комбинировать можно и нужно, хотя бы для того, чтобы залогировать/показать пользователю внятную ошибку.
Для меня "общая" обработка ошибок существует только в рамках логирования, все остальное, если знаешь как выйти из ситуции при ошибке, ловишь только ее и действуешь, каждый случай частный.
Всегда можно сделать что-то типа:
try{
// code
} catch (Exception e) {
Namespace.ExceptionHandler(e, this, "MethodName");
} finally {
// и тут что-то пишешь, если надо
}
В итоге у тебя в обрабочике ExceptionHandler будет и сама ошибка, и обьект, что ее вызвал и название метода. Проверяй тип ошибки и обрабатывай как душе угодно имея доступ к самому обьекту, если надо в нем поменять какие-то данные или еще чего.