我怎样才能创建自己的例外?

时间:2010-11-11 21:33:45

标签: c# exception-handling

这是我所拥有的代码的骨架:

if(CheckForSomething())
{
    try
    {
        //do something
    }
    catch (UnauthorizedAccessException ex)
    {
        LogException(ex, item.server);
    }
    catch (Exception ex)
    {
        LogException(ex, item.server);
    }
}
else
{
    string error = "Some error";
    //want to call LogException with error as argument
}

private static void LogException(Exception ex)
{
    //write ex to one log file
    // write ex.message to another log file
}

如何从else块调用LogException方法?我尝试将字符串转换为异常并创建异常。

7 个答案:

答案 0 :(得分:9)

一个更好的问题imo不是如何但你为什么要这样做?为什么不定义两个LogError重载,一个采用Exception,另一个采用string

private static void LogError(Exception ex)
{
    // write ex to one log file
    // write ex.message to another log file
}

private static void LogError(string error)
{
    //nothing to write to exception-specific log file
    // write error info to another log file
} 

建立自己的Exception实例并不是因为这样的日志记录。

答案 1 :(得分:8)

LogException(new Exception("some error"));

答案 2 :(得分:4)

您是否考虑将// write ex.message to another log file行为分解为单独的函数并使用所需的字符串调用该函数?

    if(CheckForSomething())
    {
        try
        {
            // do something
        }
        catch (UnauthorizedAccessException ex)
        {
            LogException(ex);
        }
        catch (Exception ex) // Never do this.  Do you know how to handle an OutOfMemoryException?
        {
            LogException(ex);
        }
    }
    else
    {
        string error = "Some error";
        LogMessage(error);
    }

private static void LogException(Exception ex)
{
    // write ex to one log file
    LogMessage(ex.Message);
}

private static void LogMessage(string message)
{
    // write message to another log file
}

答案 3 :(得分:3)

您也可以像这样制作自己的异常类:

public class LogException: Exception
        {

            public LogException() : base()
            {
            }

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

            }

        }

答案 4 :(得分:1)

Exception e = new Exception(error);      
LogException ee = new LogException (Exception e);
    throw ee;

把它放在else块

答案 5 :(得分:1)

你可以做类似前面提到的事情

LogException(new Exception("some error"));

但是创建自己的异常类可能更好:

class MyException : Exception 
{
    //...
}

然后

LogException(new MyException());

答案 6 :(得分:0)

到目前为止一些好的解决方案。你不想创建一个自定义异常只是为了记录别人会有WTF吗?读你的代码。

另一种方法是从日志的异常中提取消息......类似于

if(CheckForSomething())
{
    try
    {
        // do something
    }
    catch (UnauthorizedAccessException ex)
    {
        LogMessage(ex.Message);
    }

}
else
{
    LogMessage("Some Error!");
}
private static void LogMessage(string message)
{
  //write message to log
}

创建异常只是为了将其传递给由方法处理的格式,这是一种破解。它打破了程序员之间关于什么例外以及它们用于什么的隐含理解。