gpt4 book ai didi

c# - 我应该处理哪些异常(exception)情况

转载 作者:行者123 更新时间:2023-12-02 15:43:10 32 4
gpt4 key购买 nike

我有以下代码:

        public void OpenFile(string FileName)
{
if (FileName == null)
throw new ArgumentNullException("FileName", "OpenFile: Filename is null");


List<int> readItems = new List<int>();
using (StreamReader reader = new StreamReader(FileName))
{
string line;
int batchItem;
while ((line = reader.ReadLine()) != null)
{
if (int.TryParse(line, out batchItem))
{
readItems.Add(batchItem);
}
}
}

CurrrentFile = FileName;
FileInfo f = new FileInfo(FileName);
lock (LockObject)
{
TextWriter = f.AppendText();
TextWriter.AutoFlush = true;
}

if (readItems.Count > 0)
FileOpened(readItems);


}

我正在尝试检测可能的问题,例如/文件名为空。

在捕获和记录异常的类中,我显然有一个 catch(ArgumentNullException ex)

我是否还应该捕获 StreamReader 构造函数和 FileInfo 构造函数可能引发的异常?

我知道这听起来很愚蠢,但我想知道是否应该对我抛出的异常进行显式捕获,然后进行一般异常捕获,无论它是 catch(Exception ex) 还是尝试一下catch 绕过上面的代码并重新抛出自定义异常。否则我的 try/catch block 有大约 12 个单独的 catch 语句!

最佳答案

一般来说,如果您遵循一些简单的规则,您可以大大简化异常处理代码。

<强>1。仅捕获并处理您实际上可以处理的异常

如果您实际上无法从异常中恢复,那么您根本不应该捕获它。让异常冒泡到尽可能高的点(通常是用户界面)。

当您捕获异常时,您应该捕获非常具体的异常,并尽可能避免通用异常处理。

try
{
DoSomeStuff();
}
catch(HolyCrapItBlewedUpException ex)
{
RecoverFromExplosion();
}
catch(Exception ex)
{
//I really have no idea what happened, and I can't do
// anything about it, but I'm going to catch the
// exception anyway cause it makes me feel better
}

上述规则有咳嗽异常(exception)情况,但这让我们想到了第二条规则。

<强>2。仅使用通用异常处理进行日志记录和实现隐藏

由于您应该让异常一直冒泡到最高层,因此到达顶部的任何内容都是错误。此时,您应该记录该异常并向用户显示一些友好的消息。

try
{
DoSomeStuff();
}
catch(Exception ex)
{
//At this point it's a bug... we need to squash it!
LogException(ex);
ShowUserRecoveryOptions();
}

您可能想要执行此操作的另一个地方是为了维护 API 契约(Contract)并隐藏实现细节。如果最终用户正在调用一个方法,他们可能不需要知道发生的每个可能的问题,只需要知道它不起作用。

public void MakeMeASandwich()
{
try
{
MakeCallerASandwich();
}
catch(SecurityException ex)
{
//It's still best to distinguish between certain exceptions
// as long as it makes sense to the caller.
throw new NoIWillNotMakeYouASandwichException(ex);
}
catch(Exception ex)
{
throw new SorryICantMakeYouASandwichException(ex);
}
}

<强>3。避免像瘟疫这样的异常!

异常(exception)应该是……异常(exception)!在大多数情况下,您应该能够通过简单地提前编码来避免异常。真正的异常应该代表您无法预测会发生的事情。一个简单的例子是检查文件是否存在。

try
{
File.Open("blah.txt");
}
catch(FileNotFoundException ex)
{
File.Create("blah.txt");
}

在那个例子中,我知道该文件可能不存在......所以我应该编写代码来确保这种情况几乎永远不会发生。

var fileName = "blah.txt";

if(!File.Exists(fileName))
File.Create(fileName);

File.Open(fileName);

现在,这里仍然有可能抛出FileNotFoundException,但是我们该如何处理呢?显然,这段代码无法再对此做任何事情,因为确实发生了异常的事情。我们可以让异常冒泡到下一层,因为我们在这里无能为力。

关于c# - 我应该处理哪些异常(exception)情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9989894/

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