---
schema_version: "1"
id: 520388a75643127bd1856b52d61a057863732b1e102b17d1e034a9d991001fdd
title: 自动
collection: architect
version: next
locale: zh-cn
portal_url: https://docs.salesforce.com/architect/next/zh-cn/well-architected/guides/automated.md
canonical_url: https://staging.architect.salesforce.com/docs/architect/zh-cn/well-architected/guide/automated.html
source_site: staging.architect.salesforce.com
content_type: documentation
content_hash: 1a033e8dbb21b342bc06645ceefec9c585ae563a9b23cdb56f80e4bf875a65c5
products:
  - 精心设计
  - Architect Site Content Repo
updated_at: 2024-07-01T00:00:00Z
---
> 在[这里](/docs/architect/zh-cn/well-architected/guide/contributors)阅读我们的更新计划。

## 导言

系统通过使业务更快、更大规模地满足关键目的和目标来展示自动化行为。健康的自动化使用户能够专注于高价值的工作，并减少了在重复的手动任务或复杂的数据输入上花费的时间。

通常，自动化意味着将业务流程从一种形式转换为另一种形式：从纸质形式转换为数字形式，从旧系统转换为新系统。每个业务流程翻译都会带来一个转换的机会。

转型不是使用新技术为用户引入破坏性和混乱的变革。转型涉及创建更简单的工作方式，使业务能够毫无摩擦地发展，并使业务用户能够更深入地关注对其利益相关者真正重要的事情。从架构的角度来看，这涉及识别可以完全消除或自动处理的任务。它要求在如何使用技术及其对业务的可衡量的影响之间建立明确的联系。

关于使用 Salesforce 实现自动化，请注意一些重要事项：可以使用各种工具，使用编程和声明性技能集完成。设计架构良好的自动化不仅仅是选择使用一个自动化工具构建。它涉及使用一致和可预测的方法，并使团队能够开发、测试、部署和维护您设计的自动化。您的自动化应该采用最可[维护和可读](/docs/architect/zh-cn/well-architected/guide/intentional)的形式。

本节涵盖了如何设计和重构自动化，以使企业更快、更大规模地实现关键目标。您可以通过关注效率和数据完整性来改进 Salesforce 中自动化的架构。

## 效率

在自动化中提高效率不是像往常一样勤奋地利用 Salesforce 技术重新创建业务。它涉及深入理解团队将负责满足或跟踪的关键指标和业务结果,并了解您自动化工作内部和之间的[职能单位](/docs/architect/zh-cn/well-architected/guide/composable#功能单元)。它涉及确定您如何通过自动化创建模式，使业务更有效、更快地大规模运营。

高效的自动化逻辑将使您的系统：

- 更具可扩展性和业务价值
- 对用户更有帮助
- 更具[适应性](/docs/architect/zh-cn/well-architected/guide/adaptable-overview)，能够满足不断发展的业务需求

您可以通过流程设计和操作逻辑提高自动化的效率。

### 流程设计

流程设计包括定义工作方式。构建真正高效和有效的流程意味着您的设计不仅仅是复制当前的工作方式。识别和删除无效或不明确的步骤至关重要。优化的流程应无需不必要的步骤即可创造可衡量的业务价值(请参阅[KPI](/docs/architect/zh-cn/well-architected/guide/automated#kpi))。不明确或不必要的步骤很可能会造成技术债务，并导致自动化无法维护。

通常，发现和记录业务流程的责任属于业务分析师甚至系统管理员。架构师负责与团队的这些成员合作，以确保您的流程设计在技术上可靠且结构合理。尽早应用 Salesforce Platform 的 Knowledge 将有助于团队识别通过自动化简化的流程，或需要更改以避免昂贵自定义的流程。

要为 Salesforce 构建优化的流程，请考虑：

- **彻底定义流程**。目的不明确或定义不明确的进程更有可能在设计时被误解。这将导致基于假设的错误设计，从而导致自动化不正确或效率低下。确保您想要自动化的业务流程符合以下标准：

  - 范围为单个特定功能（请参阅[功能单元](/docs/architect/zh-cn/well-architected/guide/composable#功能单元)）
  - 具有清晰定义、可衡量的产出(请参阅[业务价值](/docs/architect/zh-cn/well-architected/guide/automated#业务价值))
  - 具有明确界定的输入和输出

- **明确流程步骤**。\* 虽然有时添加“可能有助于未来”的其他步骤很有诱惑力，但这从来都不是一个好方法。自动化的每一步都与整个流程的结果相关。确保每个流程步骤具有以下特征：
  - 执行特定的精细任务(请参阅[可撰写](/docs/architect/zh-cn/well-architected/guide/composable))
  - 进程生成其定义输出所需的（删除所有非必要步骤）
  - 可以使用最少的资源完成
  - 利用现有系统数据，而不是尽可能要求用户输入(请参阅[参与](/docs/architect/zh-cn/well-architected/guide/engaging))
  - 提供用户可以理解的输入选项，而无需了解基础系统的工作原理(请参阅[帮助](/docs/architect/zh-cn/well-architected/guide/engaging#有用))

下面的[模式和反模式](/docs/architect/zh-cn/well-architected/guide/automated#效率模式和反模式)列表显示了 Salesforce 组织中正确(和差)优化的外观。在构建之前，您可以使用这些来验证您的自动化设计，或者确定需要进一步优化的自动化。

要了解有关 Salesforce 提供的流程自动化工具的更多信息，请参阅[工具相关自动化](/docs/architect/zh-cn/well-architected/guide/automated#与自动化相关的工具)。

### 操作逻辑

操作逻辑处理流程如何有效地从设计转化为实际实施。无论事务量的峰值或正在运行的并发实例的数量如何，具有强大操作逻辑的自动化都会继续表现良好。逻辑上合理的自动化有助于企业更容易地扩展，以便在更高的需求级别上进行操作。在自动化中构建强大的操作逻辑直接关系到系统的整体[可靠性](/docs/architect/zh-cn/well-architected/guide/reliable)。

无法有效运行的自动化会提供糟糕的用户体验和客户体验，导致潜在的收入损失和客户 Trust 损失。它们还具有更高的维护成本，并可能成为延迟相关流程的瓶颈，从而导致整体系统性能问题。

要在自动化中创建有效的操作逻辑，请考虑：

- **确保创建自动化的每个人都知道正确的方法。**使用任何类型的自动化工具都可以做出糟糕的设计选择。代码与基于点击的工具相比，同样容易出错或实施选择不当。例如，使用硬编码参考 ID 是流和代码中出现的反模式。基于点击的工具不应被视为允许任何人和每个人都将自动化发布到生产的许可证。创建自动化的每个团队成员都需要知道如何以正确的方式构建它。有关如何在系统中定义和应用有效标准的更多信息，请查看[可读性](/docs/architect/zh-cn/well-architected/guide/intentional#可读性)和[设计标准](/docs/architect/zh-cn/well-architected/guide/intentional#设计标准)。
- **清楚记录所有执行路径**。自动化的使用增加不仅会增加潜在数据量，还会增加计划外调用上下文。您需要了解如何调用不同的自动化，并确保正确的事务控制（请参阅数据处理）出现在具有多个入口点的所有自动化中。例如，屏幕流不会在批量数据加载时运行，但 Apex 触发器和触发（以及自动启动）的流可能会运行。清楚地记录自动化的计划和潜在执行路径是理解在实施过程中您需要适应哪些逻辑条件的关键方面。
- **“批量化”所有数据操作（包括 SOQL）。**每个数据操作（插入、更新等）都应针对集合执行。总是。毫无例外。这就是“批量化”操作的含义。虽然平台可以支持 singleton 数据操作，但您不应允许实施 singleton 模式。
- **使用 SOSL 进行搜索操作**有一种误解，即不能对通过 SOSL 返回的记录执行数据操作。的确，不能直接针对 SOSL 结果调用 DML，但代码可以解析 SOSL 结果并创建可以在 DML 或数据库类方法中引用的集合。SOSL 和 SOQL 之间的关键区别在于各自的返回类型，以及它们如何响应广义搜索或通配符搜索。SOSL 可以处理几种 sObject 类型（这就是为什么返回类型不同），它可以处理通配符和广义字符串搜索，性能比 SOQL 好。
- **将 SOQL 视为数据操作。**请勿使用 SOQL 查找记录 — 将其用于优化数据操作。SOQL 和数据操作对[基础关系数据库](/docs/architect/zh-cn/fundamentals/guide/platform-multitenant-architecture#平台数据层)的性能影响非常相似。SOQL 甚至可以传递[明确的 DML 指示符](https://developer.salesforce.com/docs/atlas.en-us.238.0.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_for_update.htm?q=for%20update)，这将在预期的数据操作中锁定数据库行。要创建可扩展的自动化，请确保您以类似的尽职调查对待 SOQL：在没有非常具体、格式良好的选择条件的情况下不要使用它，不允许无关的字段引用，并且需要在字段和 `WHERE` 语句逻辑中的筛选器输入之间进行仔细的数据类型匹配。您的代码还应具有适当的控制，以确保查询永远不会在非批量化上下文中或根据空或空白筛选条件运行。
- **保持同步操作严格专注于实时帮助用户的工作。**在[流程优化](/docs/architect/zh-cn/well-architected/guide/automated#流程设计)期间，确定与用户需要实时或近实时执行的操作相关的逻辑，以及哪些操作可以延迟到异步(异步)事务。有关设计同步/异步操作的更多注意事项，请参见[数据处理](/docs/architect/zh-cn/well-architected/guide/automated#数据处理)。

下面的[模式和反模式](/docs/architect/zh-cn/well-architected/guide/automated#效率模式和反模式)列表显示了 Salesforce 自动化中正确(和糟糕)的操作逻辑。在构建之前，您可以使用这些来验证您的自动化设计，或者确定需要进一步优化的自动化。

要了解有关 Salesforce 提供的可帮助您规划规模的工具的更多信息，请参阅[相关工具 自动化](/docs/architect/zh-cn/well-architected/guide/automated#与自动化相关的工具)。

### KPI

自动化 KPI 衡量自动化随时间的影响。如果没有它们，您将无法判断自动化是真正增加了业务价值还是为用户造成了意想不到的复杂性。您构建的每个自动化都应与一组清晰、可衡量的 KPI 相关联。

好的 KPI 由可评测值和相关的时间范围定义。示例包括：

- 每月保存\[X 个数字]工作时间
- 处理手动数据输入失败的次数每周减少 \[Y%]

一旦有了清晰、可衡量的 KPI，您还必须了解 Salesforce 中的自动化是否以及如何生成与根据这些 KPI 进行报告相关的数据。

下面的[模式和反模式](/docs/architect/zh-cn/well-architected/guide/automated#效率模式和反模式)列表显示了 Salesforce 自动化时正确(和差)的 KPI 是什么样子。您可以使用这些来验证您现有的 KPI，或者在构建之前确定您需要更好地识别 KPI 的地方。

要了解有关 Salesforce 工具的更多信息，以获得 KPI 帮助，请参阅[工具相关自动化](/docs/architect/zh-cn/well-architected/guide/automated#与自动化相关的工具)。

### 效率模式和反模式

下表显示了在您的组织中要查找（或构建）的模式的选择，以及要避免或针对补救的反模式。

✨ 在[模式和反模式探索](/docs/architect/zh-cn/well-architected-tools/guide/easy-efficiency)器中，发现更多提高效率的模式。

<table>
    <colgroup>
       <col span="1" style="width: 10%;">
       <col span="1" style="width: 45%;">
       <col span="1" style="width: 45%;">
    </colgroup>
    <tbody>
        <tr>
            <th scope="colgroup"></th>
            <th scope="colgroup">模式</th>
            <th scope="colgroup">反模式</th>
        </tr>
        <tr>
            <td rowspan="2"><b>流程设计</b></td>
            <td><b>在您的组织中：</b>
            <br> - 每个流服务于一个特定目的
            <br> - 每个步骤执行特定的精细任务
            <br> - 流以层次结构组织，包括主流和支持子流
            <br> - 所有用户输入在流中都有明确的目的
            <br> - 仅在无法使用现有系统数据时要求用户提供数据</td>
            <td><b>在您的组织中：</b>
            <br> - 流服务于多种目的，需要额外的输入来提供上下文
            <br> - 流需要不使用数据的输入
            <br> - 相关步骤组包含与其他流中的步骤组重叠的功能
            <br> - 流会在存储的数据可用于替代时请求用户输入</td>
        </tr>
        <tr>
            <td><b>在 Apex 中：</b>
            <br> - 每个类都服务于一个特定的目的
            <br> - 每种方法执行特定的精细任务
            <br> - 所有输入变量在类中都有明确的目的<br> - 代码执行需要最少的资源</td>
            <td><b>在 Apex 中：</b>
            <br> - 类具有多种用途
            <br> - 方法执行多个任务或方法执行的任务与其所属类的声明目的不一致
            <br> - 输入变量未在方法中实际使用
            <br> - 从数据库或外部系统检索不必要数据的方法</td>
        </tr>
        <tr>
            <td rowspan="3"><b>操作逻辑</b></td>
            <td><b>在流中：</b>
            <br> - 没有变量引用硬编码值（适用于记录类型、用户等）
            <br> - 所有自动启动的流和进程都使用决策和/或暂停元素来评估准入条件，并防止对大量数据执行无限循环或执行
            <br> - 在大数据量上下文中，流（包括进程）将逻辑移交给 Apex
            <br> - 子流用于需要在整个业务中重用的流程部分</td>
            <td><b>在流中：</b>
            <br> - 变量包含硬编码值
            <br> - 流（包括进程）必须在批量数据加载之前手动停用
            <br> - 流（包括进程）触发“未处理异常”通知
            <br> - 即使简单的流也会定期导致与调控器限制相关的错误
            <br> - 流的一部分在流之间重复，而不是使用子流</td>
        </tr>
        <tr>
            <td><b>在 Apex 中：</b>
            <br> - 没有变量引用硬编码值（适用于记录类型、用户等）
            <br> - 所有通配符条件都显示在 SOSL 中
            <br> - SOQL 使用 <code>try-catch</code> 封装
            <br> - 循环中未显示 SOQL
            <br> - SOQL 语句具有选择性，包括：
                <br> -- 不使用 <code>LIKE</code> 比较或部分文本比较
                <br> -- 比较运算符使用正逻辑（即 <code>INCLUDES</code>、<code>IN</code>）作为主要或唯一逻辑
                <br> -- 很少使用 <code>= NULL</code>、<code>!= NULL</code> 和/或始终跟在正比较运算符之后
                <br> -- 未显示 <code>LIMIT 1</code> 语句
                <br> -- 不使用 <code>ALL ROWS</code> 关键字
            <td><b>在 Apex 中：</b>
            <br> - 变量包含硬编码值
            <br> - SOSL 很少或没有一致地用于通配符选择条件
            <br> - SOQL 未封装在 <code>try-catch</code> 中
            <br> - SOQL 显示在循环中
            <br> - SOQL 语句是非选择性的，包括：
                <br> -- 显示<code>点赞</code>和通配符筛选条件
                <br> -- 使用 <code>NOT</code>、<code>NOT IN</code> 条件的比较用作主要或唯一比较运算符
                <br> -- <code>= NULL</code>、<code>!= NULL</code> 条件用作主要或唯一比较运算符
                <br> -- 显示 <code>LIMIT 1</code> 个报表
                <br> -- 使用<code>所有行</code>关键字
        </tr>
        <tr>
            <td><b>在设计标准和文档中：</b>
                <br> - 清晰概述自动化的计划和潜在执行路径
                <br> - 自动化中同步和异步操作的用例被清楚地概述为设计标准的一部分
            </td>
            <td><b>在设计标准和文档中：</b>
                <br> - 自动化调用未记录
                <br> - 同步和异步操作的用例未处理
            </td>
        </tr>
        <tr>
            <td rowspan="2"><b>KPI</b></td>
            <td><b>在您的文档中：</b>
            <br> - 每个自动化的输出都是可测量和有时限的
            <br> - 为每个 KPI 列出负责任的利益相关者</td>
            <td><b>在您的文档中：</b>
            <br> - 自动化没有 KPI，或者测量的时间范围不明确
            <br> - KPI 没有负责任的利益相关者</td>
        </tr>
        <tr>
            <td><b>在报表和仪表板中：</b>
            <br> - 与 KPI 相关的所有度量都包含在至少一个报表或仪表板中</td>
            <td><b>在报表和仪表板中：</b>
            <br> - KPI 报表不存在或报表缺少与一些 KPI 相关的度量</td>
        </tr>
    </tbody>
</table>

## 数据完整性

数据完整性是指系统如何维护准确和完整的数据。Salesforce 平台维护强大的[内置处理逻辑](/docs/architect/zh-cn/fundamentals/guide/architecture-basics#数据库操作)，旨在保护存储在单个组织的关系数据库中的数据的完整性。构建健康的自动化的一个基本要素是了解 Salesforce 的内置数据完整性行为，并确保您的所有自动化设计都符合（并确认）这些行为。

自动化设计中最大的反模式来自未能识别 [Salesforce 已经提供](/docs/architect/zh-cn/fundamentals/guide/architecture-basics#数据库操作)的强大数据完整性服务，以及未能使用利用这些服务的[标准功能](/docs/architect/zh-cn/well-architected/guide/intentional#标准与自定义功能)。要设计保护和维护数据完整性的自动化，您必须熟悉 Salesforce 操作行为的基本顺序。

将数据完整性正确扩展到自定义自动化意味着您的系统可以：

- 无需手动干预即可对批量和大量数据进行操作，
- 在需要时强制执行用户安全策略，在需要时切换到系统上下文，
- 在运行时遇到错误，并遵循可预测的恢复或故障路径。

通过适当的数据处理和错误处理，您可以在 Salesforce 自动化中构建更好的数据完整性。

### 数据处理

在 Salesforce 中设计正确数据处理的第一步是了解多租户平台如何处理[事务](/docs/architect/zh-cn/fundamentals/guide/architecture-basics#交易)。这包括了解 Salesforce Platform 用来确保记录级数据操作期间数据完整性的内置[执行](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm)行为顺序。有关此行为影响的更多信息，请查看 Salesforce 架构基础中的[数据库操作](/docs/architect/zh-cn/fundamentals/guide/architecture-basics#数据库操作)。

自动化中数据处理不佳可能是一些最难以识别和完全补救的反模式。平台执行顺序的递归性和重叠性会使人难以发现问题的根源。抛出致命错误或超出调控器限制的代码或流的特定部分可能不是基础数据处理问题的根本原因。

*事务感知*是构建自动化的关键，这些自动化可以通过 Salesforce 可靠和大规模地执行。这意味着确保自动化中的每个步骤在设计时都了解与平台控制[的执行顺序](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm)相关的知识,能够正确执行其功能,并将信息正确传递给下一个步骤。

无论您使用的是哪种自动化工具，正确的事务意识都遵循类似的模式，并需要共同的注意事项：

- 假设在任何给定时间，每个自动化都会被要求针对大量数据运行，恕不另行通知。自动化应具有允许批量或批量执行的路径(请参阅[可扩展性](/docs/architect/zh-cn/well-architected/guide/reliable#可扩展性))。
- 请勿在同一事务中混合使用系统和用户上下文数据操作。
- 为[*之前*的上下文](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_context_variables.htm)保留同步数据操作，并为所有*之后*的上下文操作使用异步操作。
- 使用[消息和通知](/docs/architect/zh-cn/well-architected/guide/engaging#通知和消息)，避免创建需要用户根据异步操作的结果等待数据的应用程序内体验。

除了事务意识之外,数据处理还有第二个维度:知道何时在不同[的执行上下文](/docs/architect/zh-cn/fundamentals/guide/architecture-basics#执行上下文)中执行逻辑。将自动化分解为不同执行上下文的常见原因包括：

- **大数据量和/或复杂数据操作**
  - [批量化操作](/docs/architect/zh-cn/well-architected/guide/automated#数据处理)不能保证自动化能够正确处理大量数据。如果自动化中的数据操作量将超过每个事务限制，您将需要使用特定于大数据量的功能进行数据操作(例如通过批量 Apex 或[批量 2.0 API](https://developer.salesforce.com/docs/atlas.en-us.api_asynch.meta/api_asynch/asynch_api_intro.htm))。它们具有不同的事务限制，适合大数据量。
  - 当批量执行时，需要在记录之间遍历复杂关系层次结构或执行复杂重新计算（不包括公式字段）的数据操作很容易超出每个事务的限制。请考虑，就完成系统中的后续操作所需的相关数据操作或 SOQL 而言，更新一个记录有多“吵”。
  - 自动化整个链中涉及的 sObject 类型可能需要将数据操作拆分为单独的事务，以避免“[混合 DML](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_dml_non_mix_sobjects.htm)”错误。
- **需要在用户或系统上下文中执行的逻辑**
  - Salesforce 平台在用户上下文中强制实施[共享和可见](/docs/architect/zh-cn/well-architected/guide/secure#共享和可见性)性。如果您需要执行超出自动化用户权限级别的操作，您必须确保这些操作在系统上下文中执行。
  - 不同的工具将运行或不会运行在不同的上下文中：
    - 默认情况下，Apex 将在系统上下文中运行。通过在 Apex 类定义中使用[共享关键字](https://developer.salesforce.com/docs/atlas.en-us.238.0.apexcode.meta/apexcode/apex_classes_keywords_sharing.htm?q=run%20as%20user)，您可以控制 Apex 行为是否以及如何强制执行用户级共享规则。
    - 流没有单一的默认行为。[根据流的启动](https://help.salesforce.com/s/articleView?id=sf.flow_distribute_context.htm&type=5)方式，流将在用户或系统上下文中运行。您可以选择在系统上下文中强制共享。
    - 进程（即使用进程构建器构建的自动化）在系统上下文中运行，没有共享注意事项。（注意：我们建议使用流构建低代码自动化。
- **需要异步执行的逻辑**
  - 外部系统操作 - 访问外部数据的同步标注或操作不包括在任何平台回滚行为中。为了利用这些行为,您必须将涉及外部系统的操作放入单独的事务中(使用异步 [Apex](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_async_overview.htm) 方法、[异步路径](https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_builder_asynchronous_path.htm&type=5&release=234)或[可调用操作](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_forcecom_flow_invocable_action_callout.htm))。
  - 事件和消息传递 -- -- 要控制与数据操作相关的事件或消息的流(并利用平台回滚行为)，请使用异步 Apex 方法将与消息传递或事件相关的所有操作放在[_上下文之后_](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_context_variables.htm)。

下面的[模式和反模式](/docs/architect/zh-cn/well-architected/guide/automated#数据完整性模式和反模式)列表显示了 Salesforce 自动化中正确(和糟糕)的数据处理。您可以在构建之前使用这些来验证您的自动化设计，或者确定需要重构的自动化来改进数据处理。

要了解有关 Salesforce 提供的自动化数据处理工具的更多信息，请参阅[自动化相关工具](/docs/architect/zh-cn/well-architected/guide/automated#与自动化相关的工具)。

### 错误处理

错误处理对于数据完整性至关重要。强大的错误处理还有助于您的系统以更高的[弹性](/docs/architect/zh-cn/well-architected/guide/resilient)进行扩展和老化。

自动化中的错误处理不当会导致：

- 记录不一致和其他数据完整性问题
- 向用户和其他系统发送不正确的通知
- 在手动或重复处理上浪费时间和资源
- 对系统总体缺乏 [Trust](/docs/architect/zh-cn/well-architected/guide/trusted-overview)

自动化中的错误处理需要使任何正在运行的进程能够解析错误以获取信息，访问关于后续步骤应该基于错误信息的逻辑，然后遵循正确的路径。这些功能不需要在每个自动化中重复构建(这是[优化反模式](/docs/architect/zh-cn/well-architected/guide/automated#流程设计) ) 。相反，系统中的每个自动化应能够连接到相关的错误处理[组件](/docs/architect/zh-cn/well-architected/guide/composable#松耦合)。

要在自动化中构建适当的错误处理控制，请提出以下问题：

- 什么是“致命”错误？
- 什么是“可恢复”错误？
- 对于由用户操作触发的自动化，自动化如何在尝试提交更改之前捕获并通知用户错误？

在您决定如何处理这些错误后，您可以开始在自动化中建立有效的错误处理。以下[模式和反模式](/docs/architect/zh-cn/well-architected/guide/automated#数据完整性模式和反模式)列表显示了 Salesforce 自动化中正确(和差)错误处理的外观。您可以使用这些在构建之前验证您的自动化设计，或者确定需要重构的自动化，以改善错误处理。

要了解有关 Salesforce 错误处理可用工具的更多信息，请参阅[工具相关自动化](/docs/architect/zh-cn/well-architected/guide/automated#与自动化相关的工具)。

### 数据完整性模式和反模式

下表显示了在您的组织中要查找（或构建）的模式的选择，以及要避免或针对补救的反模式。

✨ 在[模式和反模式探索](/docs/architect/zh-cn/well-architected-tools/guide/easy-data-integrity)器中，发现更多数据完整性模式。

<table>
    <colgroup>
       <col span="1" style="width: 10%;">
       <col span="1" style="width: 45%;">
       <col span="1" style="width: 45%;">
    </colgroup>
    <tbody>
        <tr>
            <th scope="colgroup"></th>
            <th scope="colgroup">模式</th>
            <th scope="colgroup">反模式</th>
        </tr>
        <tr>
            <td rowspan="4"><b>数据处理</b></td>
            <td><b>在您的数据字典中：</b>
            <br> - 存在所有数据源和数据湖对象的字段级数据和优先级逻辑
            <br> - 存在从数据湖对象到数据模型对象的字段映射</td>
            <td><b>在您的数据字典中：</b>
            <br> - 不包括数据源和数据湖对象的字段级数据和优先级逻辑
            <br> - 不包括从数据湖对象到数据模型对象的字段映射</td>
        </tr>
        <tr>
            <td><b>在 Apex 中：</b>
            <br> - 所有同步 DML 语句或数据库类方法都在触发器执行上下文<i>之前</i>执行
            <br> - 异步 Apex 调用使用可排队项在事务之间“链接”复杂的 DML
            <br> - 批量 Apex 专用于大数据量
            <br> - <code>@future</code> Apex 未用于标注或系统对象 DML 或未谨慎使用</td>
            <td><b>在 Apex 中：</b>
            <br> - DML 语句定期出现在将在触发器上下文<i>后</i>调用的代码中
            <br> - 异步 Apex 很少使用
            <br> - 异步 Apex 功能被任意使用，包括：
            <br> -- 未来方法和可排队 Apex 使用不一致或互换
            <br> -- 数据库操作没有明确一致的逻辑来在需要时将执行传递给批处理 Apex</td>
        </tr>
        <tr>
            <td><b>在流中：</b>
            <br> - 在用户上下文中启动的所有流将所有系统上下文事务抽象到子流，这些子流一致放在暂停元素之后，<a href="https://help.salesforce.com/s/articleView?id=flow_concepts_transaction.htm&type=5&language=en_US">以创建新事务</a>
            <br> - 使用 Orchestrator 创建相关数据操作的复杂序列（而不是调用单个流中的多个子流）
            <br> - 所有记录触发的流都填充了<a href="https://help.salesforce.com/s/articleView?id=release-notes.rn_automate_flow_builder_trigger_order.htm&type=5&release=236">触发顺序值</a>
            <br> - 涉及外部系统标注或长时间运行的流程的流使用异步路径</td>
            <td><b>在流中：</b>
            <br> - 大型单片流尝试协调相关数据操作的复杂序列（带或不带子流）
            <br> - 记录触发的流根本不使用触发顺序属性，或者没有一致使用触发顺序值
            <br> - 异步路径的使用不一致或根本不一致</td>
        </tr>
        <tr>
            <td><b>在您的组织中：</b>
            <br> - 身份解析协调规则遵循数据字典中的优先级逻辑</td>
            <td><b>在您的组织中：</b>
            <br> - 身份解析协调规则不遵循数据字典中的优先级逻辑</td>
        <tr/>
        <tr>
            <td rowspan="4"><b>错误处理</b></td>
            <td><b>在 Apex 中：</b>
            <br> - 代码包含 <code>try- catch</code> 块中的所有 DML、SOQL、标注和其他关键流程步骤
            <br> - 自定义异常用于创建高级错误消息和逻辑<br> - 在异步和批量上下文中，使用数据<a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_dml_database.htm">库类方法</a>，而不是 DML
            <br> - 数据库类方法可以专用于所有数据操作（而不是 DML）</td>
            <td><b>在 Apex 中：</b>
            <br> - DML、SOQL、标注或其他关键流程步骤没有一致地封装在<code>试用</code>块中
            <br> - <code>System.debug</code> 语句出现在生产代码中（不会被注释掉）
            <br> - 不使用数据库类方法
            <br> - 数据操作仅通过 DML 完成</td>
        </tr>
        <tr>
            <td><b>在 Lightning Web 组件中:</b>
            <br> - JavaScript 将所有数据操作和关键流程步骤封装在 <code>if ()</code>/<code>else if ()</code> 块中
            <br> - 所有 <code>@wire</code> 函数都使用 API 提供的<code>数据</code>和<code>错误</code>属性
            <br> - All <code>if (error)</code>/<code>else if (error)</code> 语句包含处理错误和提供信息性消息的逻辑</td>
            <td><b>在 LWC 中：</b>
            <br> - <code>如果 ()</code>/<code>如果 ()</code> 包含数据操作或关键流程步骤的块，JavaScript 不会一致使用
            <br> - <code>@wire</code> 函数不使用 API 提供的<code>数据</code>和<code>错误</code>属性（或没有一致使用）
            <br> - 如果使用，<code>if (error)</code>/<code>else if (error)</code> 语句实际上不包含处理错误和提供有用错误消息的逻辑</td>
        </tr>
        <tr>
            <td><b>在 Aura 中：</b>
            <br> - JavaScript 将所有数据操作和关键流程步骤封装在<code>试用捕获</code>块中
            <br> - 在 <code>try-catch</code> 块中，本地 JavaScript <code>错误</code>在 throw 语句中使用（不使用 <code>$A.error()</code>）
            <br> - 所有可恢复的错误逻辑都出现在 <code>catch</code> 语句中，并提供明确的用户消息</td>
            <td><b>在 Aura 中：</b>
            <br> - JavaScript 没有一致地将数据操作和关键流程步骤封装在<code>尝试捕获</code>块中
            <br> - 组件使用 <code>$A.error()</code>
            <br> - 可恢复的错误逻辑并不总是出现在 <code>catch</code> 语句中，并且对用户的错误消息不清楚</td>
        </tr>
        <tr>
            <td><b>在流中：</b>
            <br> - 屏幕流始终使用错误连接器向用户显示错误
            <br> - 为屏幕上显示的错误配置自定义错误消息
            <br> - 具有数据操作、标注和其他关键处理逻辑的流具有所有关键操作的错误路径</td>
            <td><b>在流中：</b>
            <br> - 流没有一致或根本不使用错误路径
            <br> - 未使用自定义错误消息，因此用户会看到默认“此流中发生未处理的错误”消息</td>
        </tr>
    </tbody>
</table>

## 业务价值

在自动化环境中，业务价值的概念是关于流程如何为业务利益相关者创造可衡量的积极影响。理想情况下，流程自动化使用户能够减少花费在重复、低价值任务上的时间。它还有助于通过消除可能导致错误的手动处理活动来提高数据完整性。与[流程设计](/docs/architect/zh-cn/well-architected/guide/automated#流程设计)非常相似,识别和交付将推动实际业务价值的自动化需要基本发现和业务分析之外的工作。

有时，向业务交付价值的最佳方式似乎是简单地自动化业务用户请求的每个流程，或者按照它们在待办事项（或售票队列）中出现的顺序，或者根据组织中的政治因素。这会导致两个相关的问题：以次优的顺序构建自动化和构建完全错误的自动化。第一个问题，即优先级不佳，阻碍了高价值流程在应该实施时的实施，从而有可能降低增长。第二个问题，构建错误的自动化，不仅延迟了高价值自动化的交付，还导致了时间浪费、不必要的成本，并增加了交付团队的挫折感。

通过关注 KPI 和优先级，您可以提供更大的业务价值。

## 与自动化相关的工具

<table class="tools-table"><tbody><tr><th>工具</th><th>描述</th><th>效率</th><th>数据完整性</th><th>业务价值</th></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_batch.htm">Apex 批处理</a></td><td>将记录批处理在一起，并处理可管理的块</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_invoking_future_methods.htm">Apex 未来方法</a></td><td>在后台异步执行 Apex 方法</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_queueing_jobs.htm">Apex 队列 </a></td><td>将 Apex 作业添加到队列并监视它们</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_scheduler.htm">Apex Scheduler</a></td><td>在指定时间异步执行 Apex 类</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=what_are_approvals.htm&type=5&language=en_US">批准</a></td><td>指定批准记录所需的步骤</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_async_overview.htm">Asynchronous Apex</a></td><td>异步运行 Apex 代码</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=customize_automatedactions.htm&type=5&language=en_US">自动操作</a></td><td>在后台执行字段更新、电子邮件发送和其他操作</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=einstein_next_best_action.htm&type=5&language=en_US">Einstein Next Best Action</a></td><td>在正确的时间向正确的人显示正确的推荐</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col">X</td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=customize_wfalerts.htm&type=5&language=en_US">电子邮件提醒</a></td><td>创建并发送自动电子邮件</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col">X</td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=sf.rules_escalation_actions.htm&type=5">升级操作</a></td><td>指定对个案升级采取的自动操作</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=workflow_managing_field_updates.htm&type=5&language=en_US">字段更新</a></td><td>基于自动化更新字段值</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=release-notes.rn_forcecom_flow_fbuilder.htm&type=5&release=230">流生成器</a></td><td>使用指点单击式界面构建自动化</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col">X</td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=release-notes.rn_forcecom_flow_extend.htm&type=5&language=en_US&release=230">流扩展</a></td><td>访问存储的变量作为流中的组件输入</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col"></td></tr>
<tr><td><a href="https://www.salesforce.com/products/platform/workflow-automation/workflow-library/flow-index/?#service">流模板库</a></td><td>使用模板设计特定于行业的流</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col">X</td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=creating_workflow_flow_actions.htm&type=5&language=en_US">流触发器</a></td><td>自动化复杂的业务流程</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_actions_invocable.htm">可调用操作</a></td><td>将 Apex 功能添加到流</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col">X</td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=orchestrator_flow_orchestrator.htm&type=5&language=en_US">编配员</a></td><td>创建和管理多步骤自动化</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=workflow_managing_outbound_messages.htm&type=5&language=en_US">出站消息</a></td><td>从带有回执和重试的自动化流程发送信息 </td><td class="check-col"></td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_publish_flow.htm">使用流发布平台事件</a></td><td>通过用户交互和自动化发布事件</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.salesforce_large_data_volumes_bp.meta/salesforce_large_data_volumes_bp/ldv_deployments_infrastructure_salesforce_query_optimizer.htm">查询优化器</a></td><td>使用选择性和索引改善查询、报表和列表视图性能</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=sf.flow_lightning_flow.htm&type=5">Salesforce 流</a></td><td>使用 Flow Builder 创建声明性流程自动化</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=livemessage_automatic_notifications_flows.htm&type=5&language=en_US">使用流发送通知</a></td><td>通过 SMS、WhatsApp 或 Facebook Messenger 发送消息</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col">X</td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=livemessage_automatic_message_notifications_process.htm&type=5&language=en_US">通过进程发送通知</a></td><td>通过 SMS、WhatsApp 或 Facebook Messenger 发送消息</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col">X</td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.238.0.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select_for_update.htm?q=for+update">SOQL FOR UPDATE 修改器</a></td><td>锁定记录，以防止竞赛条件和线程安全问题</td><td class="check-col"></td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=nba_strategy_builder.htm&type=5&language=en_US">Strategy Builder</a></td><td>确定要在记录页面上显示的推荐</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col">X</td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.salesforce_vpm_implementation_guide.meta/salesforce_vpm_implementation_guide/vpm_designer_about_subflows.htm">子流</a></td><td>通过重复使用降低流复杂性</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_subscribe_flow.htm">使用流订阅平台事件</a></td><td>接收通过自动化发布的消息</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=customize_wftasks.htm&type=5&language=en_US">任务操作</a></td><td>确定自动化为用户提供的分配详细信息</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col"></td></tr>
</table>

## 与自动化相关的资源

<table class="tools-table"><tbody><tr><th>资源</th><th>描述</th><th>效率</th><th>数据完整性</th><th>业务价值</th></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_gov_limits.htm">Apex 执行调控器和限制</a></td><td>了解 Apex 运行时引擎如何强制执行限制</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=sf.admin_rebates_additional_resources_for_batch_management.htm&type=5">批处理管理资源</a></td><td>创建、管理、计划和监控批处理作业</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.238.0.salesforce_large_data_volumes_bp.meta/salesforce_large_data_volumes_bp/ldv_deployments_best_practices_soql_and_sosl.htm">SOQL 和 SOSL 的最佳实践 </a></td><td>提高大数据量应用程序的查询性能</td><td class="check-col"></td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="/docs/architect/zh-cn/resources/guide/design-standards-template">设计标准模板</a></td><td>为您的组织创建设计标准</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col">X</td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=sf.flow_concepts_bulkification.htm&type=5">事务中的流批量化</a></td><td>设计针对集合操作的流</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=sf.flow_considerations_trigger_schedule.htm&type=5">流数据注意事项</a></td><td>了解批处理数据的计划触发流</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=release-notes.rn_forcecom_flow_debug.htm&type=5&release=230">流调试</a></td><td>测试流并进行故障排除</td><td class="check-col"></td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.api_asynch.meta/api_asynch/how_requests_are_processed.htm">如何处理请求</a></td><td>了解 Salesforce 如何快速处理作业并最大限度地减少失败</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="/docs/architect/zh-cn/resources/guide/kpi-spreadsheet-template">KPI 电子表格模板</a></td><td>确定特定度量的业务价值</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col">X</td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_forcecom_flow_invocable_action_callout.htm">从可调用操作对外部系统进行标注</a></td><td>使用 Apex 从流调用外部系统</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_dml_non_mix_sobjects.htm">混合 DML 操作</a></td><td>了解哪些 sObject 可以在同一事务中一起用于 DML</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_triggers_order_of_execution.htm">执行顺序</a></td><td>了解插入、更新和更新插入的事件顺序</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=000334796&type=1">查询计划常见问题解答</a></td><td>优化涉及大量数据的查询</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=sf.flow_considerations_trigger_schedule.htm&type=5">计划触发的流注意事项</a></td><td>了解计划触发的流的特殊行为</td><td class="check-col">X</td><td class="check-col"></td><td class="check-col"></td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_transaction_control.htm">交易控制</a></td><td>生成指定当前数据库状态的保存点</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=sf.flow_build_logic_fault.htm&type=5">当流失败时会发生什么？</a></td><td>了解流中的错误处理</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col"></td></tr>
<tr><td><a href="https://help.salesforce.com/s/articleView?id=000355199&type=1">工作流自动化最佳实践指南</a></td><td>Salesforce 自动化入门</td><td class="check-col">X</td><td class="check-col">X</td><td class="check-col">X</td></tr>
<tr><td><a href="https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_SOQL_VLSQ.htm">使用非常大的 SOQL 查询</a></td><td>编写更高效的 SOQL 查询</td><td class="check-col"></td><td class="check-col">X</td><td class="check-col"></td></tr>
</table>

## 告诉我们您的想法

帮助我们保持 Salesforce 架构合理与您相关；参加我们的[调查](https://sfdc.co/bxNtvh)，以提供有关此内容的反馈，并告诉我们您接下来想要看到的内容。
