提前规划异常处理策略

时间:2017-07-03 21:17:58

标签: c# .net exception exception-handling

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

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

由于

2 个答案:

答案 0 :(得分:0)

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

以下是一些可以处理意外和自定义异常的类的示例:

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 { }

希望这有帮助!

答案 1 :(得分:0)

我想把它写成评论,但是对于评论文本框来说是很长的......

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

  2. 我发现有一些例外情况对于向用户显示很重要,因为他们(用户)将充当我的QA团队,例如:某些方法不会更新GUI,他们可能会得出他们的结论应该进一步报告,他们会告诉我异常,我会发现我的阵列超出界限......

  3. 有一些例外情况,向用户宣传这些内容只会让他们感到困惑,就像你说的那样
  4.   

    “他/他不知道那是什么”

    例如,

    :例如:

      

    “如果后端的进程是不透明的,则抛出异常”。

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

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