Единственный способ, которым мог бы работать метод System.String.TryFormat
, - перехватывать любые исключения, которые могут быть выброшены из различных реализаций IFormattable.ToString
(хотя String.TryFormat
может заменить некоторые из своих собственных исключений возвращением флага ошибки, делать это, позволяя исключениям из TryFormat
escape, было бы не очень полезно).
Хуже того, метод TryFormat
не будет иметь никакого способа узнать, могут ли какие-либо исключения, выданные IFormattable.ToString
, быть вещами, которые не должны быть перехвачены. Даже если контракт IFormattable.ToString
требовал, чтобы реализации не пропускали ничего, кроме FormatException
, если спецификатор формата был недопустимым, вероятно, нужно было бы, чтобы метод String.TryFormat
возвращал false (а не бросал), если некоторые из входных объектов были недопустимый, но попытка отформатировать их не сделала ничего хуже, хотя утечка исключений, если попытка отформатировать элементы сама по себе привела к коррупции. К сожалению, при настройке иерархии исключений String.TryFormat
не сможет даже приблизиться к такой семантике.
Проще говоря, метод String.TryFormat
мало что может сделать, кроме использования блока try
/ catch
для подавления исключений, генерируемых внутренними методами. Существует нормальное значение того, что методы TryXX
должны работать лучше в случае сбоя, чем обычная процедура, которая только что выполняла XX
в блоке try-catch. Если метод TryFormat
просто будет работать, подавляя исключения в любом случае, он также может позволить потребителю справиться с этим.