Как получить больше информации об AnimationException? - PullRequest
0 голосов
/ 07 января 2020

У меня есть приложение WPF, в котором я создаю Storyboard для анимации некоторых элементов управления. После запуска анимации проект останавливается, но все, что я получаю от Visual Studio, - это выводимое ниже сообщение:

Exception thrown: 'System.Windows.Media.Animation.AnimationException' in WindowsBase.dll

Как можно получить больше информации, чтобы я точно знал, где проблема? В документации только утверждается, что

Исключение, которое генерируется при возникновении ошибки при анимации свойства.

Я понятия не имею, в какой строке код нарушен, чтобы вставить блок try-catch.

1 Ответ

1 голос
/ 07 января 2020

Прежде всего, я бы поймал эти необработанные исключения, например:

public MyCustomControl()
{
  Dispatcher.UnhandledException += Dispatcher_UnhandledException;
}

void Dispatcher_UnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
  switch (e.Exception)
  {
    case AnimationException aniEx:
      Log(aniEx.GetDetails());
      break;
    // ...
    // default: ...
  }
}

, а во-вторых, я бы добавил расширение GetDetails для исключений, чтобы получить из него все детали:

public static class Extensions
{
    /// <summary>
    /// Returns all Details of an exception
    /// </summary>
    /// <param name="exception"></param>
    /// <returns></returns>
    public static string GetDetails(this Exception exception)
    {
        string GetInnerExceptionDetails(Exception e)
        {
            var s = new StringBuilder(e.GetType().FullName);
            if (e.GetType().GetProperties()
                 .Select(prop => new { prop.Name, Value = prop.GetValue(e, null) })
                 .Select(x => $"{x.Name}: {x.Value ?? string.Empty}").ToList() is List<string> props && props.Any())
            {
                s.AppendLine(string.Join(Environment.NewLine, props));
                s.AppendLine();
            }

            if (e.InnerException != null)
                s.AppendLine(GetInnerExceptionDetails(e.InnerException));
            return s.ToString();
        }
        return GetInnerExceptionDetails(exception);
    }
}
...