Language agnostic “处理”;“例外情况”;很有可能成为;“错误”;

Language agnostic “处理”;“例外情况”;很有可能成为;“错误”;,language-agnostic,exception-handling,error-handling,Language Agnostic,Exception Handling,Error Handling,在我目前正在进行的项目中,我在区分错误和异常方面遇到了一些困难(更让人困惑的是,我不确定我对错误和异常的定义是否完全正确) 我感到困惑的地方是如何阻止异常变成错误。假设我有一个模型类,它包含一系列关系。该模型有一个model.AddRelationship()方法,可以在模型中创建循环引用。如果用户试图在UI中添加关系以创建循环引用,则必须阻止他们这样做并告知原因。因此,我一直在努力解决一些选项,例如: // In the UI when the user tries to add a rela

在我目前正在进行的项目中,我在区分错误和异常方面遇到了一些困难(更让人困惑的是,我不确定我对错误和异常的定义是否完全正确)

我感到困惑的地方是如何阻止异常变成错误。假设我有一个模型类,它包含一系列关系。该模型有一个
model.AddRelationship()
方法,可以在模型中创建循环引用。如果用户试图在UI中添加关系以创建循环引用,则必须阻止他们这样做并告知原因。因此,我一直在努力解决一些选项,例如:

// In the UI when the user tries to add a relationship:

var newRelationship:Relationship = new Relationship();

if(Model.AddingThisWillCreateACircularReference(newRelationship))
{
    this.warnUserAboutCircularReference();
}
else
{
    Model.AddRelationship(relationship);
}
我的一部分认为应该由开发人员在调用之前验证调用。毕竟,添加关系不会使程序崩溃,而是当其他代码执行导致无限循环的操作时。另一方面,我觉得有义务始终保持模型处于安全状态,我需要通过以下方式迫使开发人员处理糟糕的循环引用情况:

// In the model itself:

public function AddRelationship(relationship:Relationship):Boolean
{
    var success:Boolean = true;

    if(this.AddingRelationshipWillCreateACircularReference(relationship))
    {
        success = false;
    }
    else
    {
        this.addRelationship(relationship);
    }

    return success;
}

这样一来,他们要么知道不可能添加,要么根本无法添加关系。这也感觉不对。谁能给我一些想法,让我更清楚一些?提前感谢。

我通常使用的规则是,如果用户可以更正“错误”,那么就不要抛出异常。如果“错误”确实出乎意料,并且用户无法修复他或她的输入以克服它,那么它应该抛出异常


更深入地说,如果您正在积极检查问题,例如编写代码以确保文件或文件夹路径存在,那么您应该优雅地处理这种情况,并在不引发异常的情况下将其呈现给用户。

我通常使用的规则是,如果用户能够纠正“错误”,则不引发异常。如果“错误”确实出乎意料,并且用户无法修复他或她的输入以克服它,那么它应该抛出异常

更深入地说,如果您正在积极检查问题,例如编写代码以确保文件或文件夹路径存在,那么您应该优雅地处理这种情况,并在不引发异常的情况下将其呈现给用户。

按照惯例,“错误”指出应用程序无法干净地处理或恢复的情况(即磁盘崩溃)。异常是指应用程序可能尝试从中恢复,甚至在关闭前清理自身的异常情况

我发现将异常分为另外两种类型很有用:业务异常,它是由错误配置或错误处理应用程序引起的条件(即验证异常),和技术异常,它不是由应用程序本身引起的条件(即与数据库的连接断开、套接字超时等)

回到您的问题,pat of you是对的:模型应该始终保持一致,并且应该在尽可能低的级别上实施,以促进重用。因此,将验证放在模型中,尝试该操作,如果失败,则通知用户。如果您的语言中没有异常作为本机机制,我甚至会返回一个“结果代码”,指示操作的结果状态(即,0-成功,1-循环依赖,2-未知原因等)。

按照惯例,“错误”指出应用程序无法干净地处理或恢复的情况(即磁盘崩溃)。异常是指应用程序可能尝试从中恢复,甚至在关闭前清理自身的异常情况

我发现将异常分为另外两种类型很有用:业务异常,它是由错误配置或错误处理应用程序引起的条件(即验证异常),和技术异常,它不是由应用程序本身引起的条件(即与数据库的连接断开、套接字超时等)

回到您的问题,pat of you是对的:模型应该始终保持一致,并且应该在尽可能低的级别上实施,以促进重用。因此,将验证放在模型中,尝试该操作,如果失败,则通知用户。如果您的语言中没有作为本机机制的异常,我甚至会返回一个“结果代码”,指示操作的结果状态(即,0-成功,1-循环依赖,2-未知原因,等等)