C# 我可以重载throw关键字吗?

C# 我可以重载throw关键字吗?,c#,exception,throw,C#,Exception,Throw,我想重载throw关键字来捕获从Exception继承的类,并让它在实际抛出之前做一些日志记录和其他事情。这可能吗?还是必须使用常规函数 我试过: public class cSilException : Exception { private string m_strMsg; public override void throw(cSilException ex) { } ... ... } 您要做的是在异常中添加一

我想重载throw关键字来捕获从Exception继承的类,并让它在实际抛出之前做一些日志记录和其他事情。这可能吗?还是必须使用常规函数

我试过:

public class cSilException : Exception
    {
        private string m_strMsg;

        public override void throw(cSilException ex)
        {

        }
...
...
}

您要做的是在异常中添加一个构造函数,并在该构造函数中执行您需要执行的任何操作

public class cSilException : Exception
{
    //constructor
    public cSilException()
    {
        // do stuff here
    }
}
你的“超负荷抛出关键词”的概念相当,呃,怎么说,迷幻


当然,正如许多人指出的那样,如果您的意图是做日志之类的事情,那么最好避免这样做。阿洛伊斯·克劳斯(Alois Kraus)发布了另一个答案,并给出了一个很好的建议。

你不能超载
抛出
它是语言的一个组成部分(不是一个类的成员)

如果要处理特定异常,应
捕获该异常:

try
{
    // your code, which throws some exceptions
}
catch(cSilException csEx)
{
   // handle csEx
   throw;  // rethrow this exception
}
catch(Exception ex)
{
   // handle all other exceptions
}

此代码在与所有其他异常不同的代码块中捕获特殊异常
cSilException

查找
exception
类的方法和成员。您可以像这样定义
cSilException
的构造函数

public cSilException(string message)
{
    Message = message;
}

而不是在
catch(cSilException ex)
do
Console.WriteLine(ex.Message)中

我不建议在异常的构造函数中记录任何内容,因为它违反了单一责任原则,被认为是一种糟糕的设计。此外,创建异常的事实并不一定意味着它已被抛出,此外,可以捕获并重新抛出异常-这些事情可能会导致不正确的日志消息


相反,您可以使用应用程序范围的异常处理程序,它将根据预定义的策略处理异常。例如,您可以查看和。具体地说。

注册事件
AppDomain.FirstChanceException。
在那里,您可以在实际抛出之前获得所有异常。在事件处理程序中,您可以检查
异常
,并执行所需的日志记录

没有魔法,也没有糟糕的设计。

class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;
        DoBadThings();
    }

    private static void DoBadThings()
    {
        DoOneLevelBelow();
    }

    private static void DoOneLevelBelow()
    {

        for(int i=0;i<10;i++)
        {
            try
            {
                if (i == 5)
                {
                    var invalidCast = (string)((object)i);
                }
                else
                {
                    throw new InvalidTimeZoneException();
                }
            }
            catch
            {

            }
        }
    }

    static void CurrentDomain_FirstChanceException(object sender, System.Runtime.ExceptionServices.FirstChanceExceptionEventArgs e)
    {
        if( e.Exception is InvalidCastException)
        {
            LogInvalidCast((InvalidCastException)e.Exception);
        }
    }

    private static void LogInvalidCast(InvalidCastException invalidCastException)
    {
        Console.WriteLine("Got Invalid cast: {0}", invalidCastException);
    }
类程序
{
静态void Main(字符串[]参数)
{
AppDomain.CurrentDomain.FirstChanceException+=CurrentDomain\u FirstChanceException;
多巴德事物();
}
私有静态void DoBadThings()
{
doonelevellower();
}
私有静态void doonelevellower()
{

for(int i=0;i它的用途是什么?关键字既不可重写也不可重载。此外,如果可以重写throw,则可以从基础库中看到一些意外结果。:)请注意,如果您将异常记录在ctor中,您很可能会看到记录的异常从未真正抛出过—只是实例化了。出于记录目的,最好使用扩展/helper方法
LogAndThrow
。此外,可能会捕获并重新抛出异常—在这种情况下,您将只看到一条日志消息。这样做很有效在C++中也是一样。