2016-04-29 4 views
2

Это вопрос об обработке и предотвращении исключений.C# Исключить или проверить параметры заранее

public static string PathCombineNoEx(string path1, string path2) 
{ 
    if (path1 == null || path2 == null /*Either validate here*/) 
    { 
     return null; 
    } 

    try 
    { 
     return System.IO.Path.Combine(path1, path2); 
    } 
    catch (ArgumentException /*or catch here*/) 
    { 
     return null; 
    } 
} 

Поскольку исключения огромный удар по производительности, мы должны попытаться свести к минимуму возможность для исключения быть выброшен. В следующем примере я исключил вероятность того, что Path.Combine может выбросить ArgumentnullException. Это было очень легко сделать и почти никак не влияет на производительность. Однако Path.Combine также выбрасывает ArgumentException, если одна из двух строк параметров содержит любой недопустимый символ, предоставленный GetInvalidPathChars.

  1. Теперь вы бы рекомендовали поймать это, как я, или вы действительно проверили бы наличие недопустимых символов перед вызовом Path.Combine?
  2. Об общей рекомендации, которая может быть применена к большинству ситуаций.
  3. Возможно, есть статья Microsoft об этом?

Path.Combine документация:
https://msdn.microsoft.com/de-de/library/fyy7a5kt(v=vs.110).aspx

В .NET Ссылка Источник:
http://referencesource.microsoft.com/#mscorlib/system/io/path.cs,2d7263f86a526264

Microsft наконечник производительности (глава Throw меньше исключений):
https://msdn.microsoft.com/en-us/library/ms973839.aspx

ответ

3
  1. Ловля исключений составляет slow с исключением бросать делает трассировка стека.
  2. Ловля исключений менее читаема; это своего рода пресловутый goto: если что-то произошло, то goto catch.

Вот почему я голосую за проверки:

if (path1 == null) 
    return null; 
    if (path2 == null) 
    return null; 

    //TODO: put other validations here, e.g. Path.GetInvalidFileNameChars() 

    return System.IO.Path.Combine(path1, path2); 

И перехватывать исключения для исключительных случаев только:

try { 
    // I can't validate this, since just after I've finished it and ready to read 
    // someone can 
    // - delete/rename the file 
    // - change permissions 
    // - lock file (e.g. start writing to it) 
    String data = File.ReadAllText(@"C:\MyData.txt"); 
    ... 
    } 
    catch (IOException e) { 
    ... 
    } 
+0

@ Ноэль Видмера: Да я не сделал * поймать * '' ArgumentException' из Path.Combine': вместо этого, я предлагаю проверки: проверка для 'Path.GetInvalidFileNameChars()', 'Path.GetInvalidPathChars()' и другие, если требуется –

+0

Я знаю, как это сделать. Просто хотел знать, все ли вы это подтвердите. спасибо :) –

2

Исключения, как этот термин говорит, предназначены для обработки неожиданные ситуации. Я голосую за то, чтобы обрабатывать предвидимые случаи в коде заранее.

0

Исключения могут поразить производительность.

Если это API,

public static string PathCombineNoEx(string path1, string path2) 
{ 
    if (String.IsNullOrWhiteSpace(path1)) 
    { 
    throw new ArgumentnullException(path1); 
    } 

//Same goes for Path2 

return System.IO.Path.Combine(path1, path2); 
} 

В противном случае, ответ Дмитрия будет делать.

Полезные С.О. сообщения:

Business Objects, Validation And Exceptions

Why are Exceptions said to be so bad for Input Validation?

+0

как раз как sidenote, IsNullOrWhiteSpace возвращает bool, и ваш код проверяет его на null –

+0

@MichaelFaisst Спасибо! Обновлен код. – mlg

Смежные вопросы