使用例外更好的方法是什么?

时间:2015-05-22 09:47:45

标签: c# exception

我有两种方法可以创建例外。

第一种方式:我使用基本异常类来创建异常。

public class Class1
{
    public void Method1()
    {
        try
        {
            Method1ThrowException();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

    public void Method1ThrowException()
    {
        throw new Exception();
    }
}

第二种方式:通过这种方式,我创建了User-Defined Exception类,然后将此类用于创建异常。

public class Class2
{
    public void Method2()
    {
        try
        {
            Method2ThrowException();
        }
        catch (MethodException e)
        {
            Console.WriteLine(e);
        }
    }

    public void Method2ThrowException()
    {
        throw new MethodException();
    }
}

public class MethodException : Exception
{
    public MethodException()
    {

    }

    public MethodException(string message) : base(message)
    {

    }

    public MethodException(string message, Exception inner) : base(message, inner)
    {

    }
}

这种方式使用异常有什么区别?

我读到使用第二种方式更好,我不明白为什么?在这两种方式中,我只是创建异常并获得它们。

3 个答案:

答案 0 :(得分:2)

第二种方法更好,因为您创建了自己的异常类型,可以适用于特定情况。例如:您可以在编写通过某个网络进行通信的应用程序时创建ConnectionBrokenException类型,并在连接断开时将其抛出。

这为您提供了两个主要优势:

<强>第一
您可以使用try..catch块根据异常类型以不同方式处理异常。您可以决定向用户显示消息,回滚某些操作或执行其他操作。

try
{
    ... code throwing ConnectionBrokenException
}
catch(ConnectionBrokenException ex)
{
    _logger.LogError("Something bad has happened with connection", ex.Message);
}
catch(Exception)
{
    // handles other types of exceptions
}

<强>第二
在分析来自此类应用程序的日志时,当每个不良情况都有自己的异常时,更容易诊断某些问题。例如,您可以使用一些过滤来查找您感兴趣的例外。

答案 1 :(得分:2)

因为catch (Exception e)抓住所有内容。没有办法区分引起了什么样的例外。因此,细粒度的错误类很好。

(另外,为什么要定义Method1ThrowException,而不仅仅是throw需要抛出的异常?这只是在堆栈跟踪中添加了一个无用的层。)

答案 2 :(得分:2)

没有更好的&#39;方式,因为它取决于您的具体需求。

如果您可以使用现有的异常类型,只需使用那个(ArgumentException等)。有关列表,请参阅here

如果您需要特殊的异常类型,请创建自己的异常,包含您自己的自定义属性。示例:

 public BusinessException : Exception
 {
     public BusinessException(string reason)
     {
           Reason  = reason;
     }
     public string Reason {get; set;}
 }

如果要将它们放在WCF服务中,请确保添加全局异常处理程序以将这些异常映射到WCF故障。如果是Web API,请将它们映射到HTML状态。

相关问题