您的应用程序中通常会有一个业务逻辑层,并且您会将该库中的方法包装在安全调用中。这些方法甚至可以说明它们可以抛出哪些异常,如果您愿意,您可能希望以独特的方式处理这些异常。
下面是几个可以处理意外和自定义异常的类的示例:
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 { }
希望这会有所帮助!