我有两种方法可以创建例外。
第一种方式:我使用基本异常类来创建异常。
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)
{
}
}
这种方式使用异常有什么区别?
我读到使用第二种方式更好,我不明白为什么?在这两种方式中,我只是创建异常并获得它们。
答案 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状态。