Как я могу определить, является ли строка композитной форматирования недействительной?
-
27-09-2019 - |
Вопрос
На документацию, String.Format
бросит А. FormatException
Если либо (a) строка формата недействительна или (b) строка формата содержит индекс, который не может быть найден в Args Array.
Я хочу быть в состоянии определить, какой (если либо) из этих условий проваливаются в какую-либо произвольную строку и массив аргументов.
Есть что-нибудь, что может сделать это для меня? Спасибо!
Решение
Следуйте до ответа Гобмиля, в первом случае вы получаете:
"Input string was not in a correct format."
А во-вторых, вы получаете:
"Index (zero based) must be greater than or equal to
zero and less than the size of the argument list."
Если вам нужно ощутить, какой (для сообщений пользователей или регистрации), то вы можете использовать попытку улова, как qor72, и проверьте, начнут то, что начинается сообщение об ошибке. Кроме того, если вам нужно запечатлеть то, что была строка формата, а какие args были, вам нужно будет что-то подобное:
string myStr = "{0}{1}{2}";
string[] strArgs = new string[]{"this", "that"};
string result = null;
try { result = string.Format(myStr, strArgs); }
catch (FormatException fex)
{
if (fex.Message.StartsWith("Input"))
Console.WriteLine
("Trouble with format string: \"" + myStr + "\"");
else
Console.WriteLine
("Trouble with format args: " + string.Join(";", strArgs));
string regex = @"\{\d+\}";
Regex reg = new Regex(regex, RegexOptions.Multiline);
MatchCollection matches = reg.Matches(myStr);
Console.WriteLine
("Your format has {0} tokens and {1} arguments",
matches.Count, strArgs.Length );
}
РЕДАКТИРОВАТЬ: Добавлено простое Regex для подсчета токенов формата. Может помочь...
Надеюсь это поможет. Удачи!
Другие советы
Свойство Importatexception Message устанавливается на отчетное сообщение в каждом из этих случаев.
И ты не хочешь делать ...?
works = true;
try {
String.Parse(Format, ObjectArray);
} catch FormatException {
works = false; }
Недавно я использовал следующее регулярное выражение ниже, чтобы подтвердить строки составных форматов во всех наших файлах ресурсов
/// <summary>
/// The regular expression to get argument indexes from a composed format string
/// </summary>
/// <remarks>
/// example index alignment formatString
/// {0} 0
/// {1:d} 1 d
/// {2,12} 2 12
/// {3,12:#} 3 12 #
/// {{5}}
/// {{{6}}} 6
/// </remarks>
private static readonly Regex ComposedFormatArgsRegex =
new Regex(@"(?<!(?<!\{)\{)\{(?<index>\d+)(,(?<alignment>\d+))?(:(?<formatString>[^\}]+))?\}(?!\}(?!\}))",
RegexOptions.Compiled | RegexOptions.ExplicitCapture);
Для получения дополнительной информации о составных отформатированных струнах см. http://msdn.microsoft.com/en-us/library/txafckwd(v=vs.110).aspx.