В конечном счете, ответ здесь прост: всякий раз, когда это полезно для вас , что полностью контекстуально. В подавляющем большинстве случаев на самом деле не стоит особо проверять исключение вообще - кроме сообщения об этом; просто "сделать вещь, упс, не удалось" - у вас обычно должно быть больше using
и finally
, чем catch
, IMO - потому что обычно нет ничего полезного, что вы можете сделать с исключением кроме пузыря это вверх.
Однако в некоторых случаях есть полезный контекст. Классическими примерами могут быть AggregateException
, TargetInvocationException
и TypeInitializationException
или что-нибудь от XmlSerializer
. Это довольно редко, так что вы не захотите начинать проверять их явно , если только у вас нет веских оснований ожидать их. С точки зрения вашего общего кода сообщения об ошибках: да, имеет смысл регистрировать внутренние исключения, но .ToString()
обычно делает это автоматически, IIRC.
В качестве примера из некоторого реального кода, включающего InnerException
- в моем сетевом коде есть сценарий, в котором меня не волнует очень специфическая ситуация, обнаруживаемая только с помощью комбинации внешнего и внутреннего исключения ; when
делает эту работу за меня:
try
{
await _server.RunClientAsync(connection.Transport).ConfigureAwait(false);
}
catch (IOException io) when (io.InnerException is UvException uv && uv.StatusCode == -4077)
{ } //swallow libuv disconnect
(все, кроме этого сценария, запутано)