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