提前规划异常处理策略



当我查看.NET Framework中的方法时,它可能会引发几个可能的异常。

从规划的角度来看,我需要问什么来计划和处理这些异常?我知道,根据异常的影响,这将影响在 UI 层中显示它。例如,如果后端对用户体验不透明的进程抛出异常,您不希望向用户显示该异常,因为他/她不知道那是什么。

谢谢

我想把它写成评论,但它渴望评论文本框......

  1. 有一些例外情况对于向用户显示很重要,因为他们可以自己处理它,例如:文件名是非法的。

  2. 我发现向用户展示一些例外很重要,因为他们(用户(将充当我的 QA 团队,例如:某些方法不会更新 GUI,他们可能会得出结论,他们应该进一步报告,他们会向我显示异常,我会发现我的数组越界......

  3. 有一些例外情况,将它们推广给用户只会让他们感到困惑,就像你说的

"他/她不会知道那是什么">

例如,例如:

"如果后端不透明的进程会引发异常"。

我为自己保存的那些例外(在数据库中..(..
我总是提醒自己,与开发人员相比,最终用户的心理不同(-:

我希望我以正确的方式理解了你的问题。

您的应用程序中通常有一个业务逻辑层,并且您将该库中的方法包装在安全调用中。 这些方法甚至可以说明它们可以引发哪些异常,如果您愿意,您可能希望以独特的方式处理这些异常。

下面是几个可以处理意外异常和自定义异常的类的示例:

class Program
{
static void Main(string[] args)
{
MethodInvokationResult result = SafeActionInvokator.HandleSafely(() =>
{
MyFakeBusinessEngine.DivideTwoNumbers(5, 0);
});
if (result.Exception is System.DivideByZeroException)
{
Debug.WriteLine($"A divide by zerp exception was caught");
}
else if (!result.Success)
{
Debug.WriteLine($"An unknown error occured.");
}
}
}

^ 您可以看到您可以包装调用并以合理的方式处理它们。

public class MethodInvokationResult
{
public bool Success { get; set; }
public Exception Exception { get; set; }
}

^ 一个简单的结果类

public static class MyFakeBusinessEngine
{
/// <summary>
/// Divides two numbers
/// </summary>
/// <param name="a">numerator</param>
/// <param name="b">denominator</param>
/// <returns>the result</returns>
/// <exception cref="System.DivideByZeroException">When b is zero, divide by zero exception is thrown.</exception>
public static int DivideTwoNumbers(int a, int b)
{
return a / b;
}
}

^ 一个有据可查的方法,它甚至告诉其他开发人员它期望抛出什么异常

public static class SafeActionInvokator
{
/// <summary>
/// Executes a method, and if any exception is thrown, will log the error and swallow the exception.
/// </summary>
/// <param name="methodToExecute"></param>
public static MethodInvokationResult HandleSafely(Action methodToExecute)
{
try
{
methodToExecute.Invoke();
return new MethodInvokationResult()
{
Exception = null,
Success = true
};
}
catch (Exception ex)
{
Debug.WriteLine($"{ex}");
return new MethodInvokationResult()
{
Exception = ex,
Success = false
};
}
}
}

^ 你调用的方法的包装器,将其包装在 try catch 中,允许你以相同的方式处理所有异常,或者将你想要的任何自定义逻辑放在那里。

这可以扩展为也可以返回任何实际结果值的调用。 您可以创建一个通用的结果类,而不是我展示的简单结果类。

最后! 至于您的实际问题,我会在您的应用程序中创建其中一些层,并重新抛出包含严重等级的任何异常。 这些将传播到 UI 层,你可以根据严重性选择要执行的操作。

甚至可能是这样的东西!

public class MajorException : Exception { }
public class MediumException : Exception { }
public class MinorException : Exception { }
public class UserError : Exception { }

希望这有帮助!

最新更新