gpt4 book ai didi

c# - 让异常冒泡

转载 作者:太空狗 更新时间:2023-10-30 00:00:24 25 4
gpt4 key购买 nike

如何正确地让异常冒泡?
如果我在调用方法时使用 Try-Catch,是否只是在方法内部抛出异常,就像根本不 try catch 它一样?
例如:这些方法是否起到同样的作用?

示例 1:

try
{
MyFileHandlingMethod();
}
catch (IOException ex)
{
string recfilepath = "...
string rectoadd = "RecDateTime=" + DateTime.Now.ToString()+ ...+ex.Message.ToString();
File.AppendAllText(recfilepath, rectoadd);
}
catch (exception)
{
throw;
}
...
MyFileHandlingMethod()
{
...
TextReader tr2 = new StreamReader(nfilepath);
resultN = tr2.ReadLine();
tr2.Close();
...
}

示例 2:

try
{
MyFileHandlingMethod();
}
catch (IOException ex)
{
string recfilepath = "...
string rectoadd = "RecDateTime=" + DateTime.Now.ToString()+ ...+ex.Message.ToString();
File.AppendAllText(recfilepath, rectoadd);
}
catch (exception)
{
throw;
}
...
MyFileHandlingMethod()
{
...
try
{
TextReader tr2 = new StreamReader(nfilepath);
resultN = tr2.ReadLine();
tr2.Close();
}
catch (Exception)
{
throw;
}
...
}

最佳答案

是的,这两种方法几乎具有相同的效果;重抛遗嘱 unwind the stack of the exception - 意味着 throw; 将被丢弃的方法“下方”的堆栈帧。它们仍将位于堆栈跟踪中,但您将无法在调试器中访问它们的局部变量,除非您中断抛出的异常。

像下面这样的 catch/throw block ,你不做任何异常(比如日志记录),是无用的:

 catch (Exception)
{
throw;
}

在您的两个样本中将其移除以进行清理。一般来说,尽可能避免进入 catch block


并且您的方法还有另一个与异常相关的问题,它没有正确释放资源。 tr2.Close(); 属于 finally 子句,但让编译器使用 using() {} 处理它要容易得多 block :

void MyFileHandlingMethod()
{
...
using (TextReader tr2 = new StreamReader(nfilepath))
{
resultN = tr2.ReadLine();
} //tr2.Dispose() inserted automatically here
...
}

关于c# - 让异常冒泡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6593922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com