gpt4 book ai didi

c#专业错误处理

转载 作者:行者123 更新时间:2023-12-03 07:50:04 25 4
gpt4 key购买 nike

我正在尝试学习专业的错误处理技术,但我无法掌握它们的概念,即使我已经阅读了很多来自 MSDN 和 CodePlex 的文章。

我将尝试通过一个简化的示例来表达我的担忧。我对错误处理的唯一要求是我不希望我的程序仅仅因为发生错误而退出。我希望能够看到错误是什么,但如果文件中有更多错误,我希望在进程完成后查看所有错误的列表(目前我将所有错误消息存储在一个变量中,我之后刷新到 StreamWriter 到文件)。

我读到您可以使用自定义 处理自定义错误。应用程序异常 诸如以下的类:

public class CustomException : ApplicationException
{
public CustomException() : base() { }
public CustomException(string sMessage) : base(sMessage) { }
}

这是代码示例:
我们正在合作的头等舱
public class Person
{
public Person(string _Name, int _Age)
{
this.Name = _Name;
this.Age = _Age;
}

public string Name { get; set; }
public int Age { get; set; }
}

现在是用于某些工作的类:
public class MyWorker
{
//here we store errors
public string sErrorMessage { get; set; }

public void DoStuff()
{
//reset variables
sErrorMessage = string.Empty;

try
{
//create new array of employees
List<Person> Employees = new List<Person>()
{
new Person("Steven",30),
new Person("John",26),
new Person("Anna",18)
};

//first check if value is not null
if (Employees == null || Employees.Count == 0)
{
throw new CustomException("Employee array is empty. Nothing to validate!");
}

//Data validation
foreach (var item in Employees)
{
if (item.Name == "John")
throw new CustomException("John is not allowed!");

if (item.Age < 21)
throw new CustomException("Person has to be older than 21!");
}
}
catch (CustomException ex)
{
InsertErrorMessage(ex.Message);
}
}
public void InsertErrorMessage(string sMessage)
{
sErrorMessage += Environment.NewLine + sMessage;
}
}

这是我现在进行验证的方式:
    public void DoStuff()
{
//reset variables
sErrorMessage = string.Empty;

//create new array of employees
List<Person> Employees = new List<Person>()
{
new Person("Steven",30),
new Person("John",26),
new Person("Anna",18)
};

//first check if value is not null
if (Employees == null || Employees.Count == 0)
{
InsertErrorMessage("Employee array is empty. Nothing to validate!");
}

//Data validation
foreach (var item in Employees)
{
if (item.Name == "John")
InsertErrorMessage("John is not allowed!");

if (item.Age < 21)
InsertErrorMessage("Person has to be older than 21!");
}
}

对我来说,在 try-catch block 中捕获异常的唯一优点是它可以为您提供额外的信息,例如在哪一行检测到错误,哪个模块给出了错误,......

尽管如此,我相信我不理解这个概念,并且我的带有“正确”错误处理的代码(或者至少应该看起来像正确的错误处理)是不正确的,必须以不同的方式编写。

有人可以帮我理解这样做的真正附加好处是什么吗?或者也许分享一些可以解释这一点的文章/视频?

编辑:
只是一个快速的想法 - 也许异常不用于验证,但在诸如'StreamReader试图访问锁定文件'等过程中......?

最佳答案

我建议像你一样保持你的验证方法。仅将异常用于错误处理。如果您只看名称,您的验证由规则组成,而不是异常(exception)。如果发生意外情况,您将触发异常。

一条经验法则是不要使用异常来构建程序逻辑。

一个快速的谷歌也给了我this code review post其中还简要讨论了错误处理与验证。

编辑:有人可能会争论包装你的代码 DoStuff() try/catch block 中的方法,然后存储一般错误。这样,如果发生意外情况,您的程序就不会崩溃。在那种情况下,我实际上会使用 catch(Exception ex)但请确保记录异常以使您的(调试)生活更轻松。

关于c#专业错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32051351/

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