gpt4 book ai didi

c# - 来自不同地方的相同类型异常

转载 作者:行者123 更新时间:2023-11-30 18:25:35 25 4
gpt4 key购买 nike

假设您为不同格式的文件编写了两个不同的库。一个解析类型 A 的文件,一个解析类型 B。现在我看到,在大多数情况下,大多数人都说已经定义的异常(假设我们使用 C# 和 .NET)足以处理大多数情况。在这种情况下,我认为在这两种情况下都可以,如果我们在解析时遇到一些问题,我们会抛出一个 InvalidDataException 告诉我们格式不正确。当我们必须在必须执行的更高级别的函数中捕获两个异常时会发生什么他们有事吗?

void SomeHigherFunction()
{
try
{
int x = GetSomeDataFromFileA(); // throws InvalidDataException
int y = GetSomeDataFromFileB(); // throws InvalidDataException
}
catch(InvalidDataException) // what failed ?
{
ShowMessageWithWhatFileFailed() // what display ?
}
}

我们如何知道代码在哪里失败?在这种情况下是否应该定义两种不同的异常类型,一种是 TypeAException 和一种是 TypeBException 还是我想念的一些简单的东西?我不想包装每个函数并返回带有结果的 bool 值。在这种情况下,我会将函数 A 包装在一个函数中,如果成功则让它返回 true 并进一步执行 B。但这显然是一个糟糕的设计和对异常的错误使用。在这种情况下我应该只创建新类型吗?或者如何?

最佳答案

您可以使用 Exception.Data Collection 来传递异常的所有者并进一步处理它。

我稍微重构了你的例子,但我认为这符合你的要求:

class Program
{
[Serializable]
public abstract class Parser
{
public int GetData()
{
bool error = true;
if (error)
{
InvalidDataException exception = new InvalidDataException();
exception.Data.Add("owner", this);
throw exception;
}
return 0;
}

public abstract void handleError();
}
[Serializable]
private class ParserA : Parser
{
public override void handleError()
{
Console.WriteLine("Handled in A");
}
}
[Serializable]
private class ParserB : Parser
{
public override void handleError()
{
Console.WriteLine("Handled in B");
}
}
static void Main(String[] args)
{
try
{
int x = new ParserA().GetData();
int y = new ParserB().GetData();
}
catch (InvalidDataException ex)
{
Parser parser = ex.Data["owner"] as Parser;
if(parser != null)
parser.handleError();

// or even this if you prefer:
if (parser is ParserA)
Console.WriteLine("A");
}
}
}

在实际情况下,GetData 方法是虚拟的,但您明白了

关于c# - 来自不同地方的相同类型异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29904923/

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