错误处理
Mastra workflows 通过执行后的结果状态检查、针对瞬态故障的重试策略,以及用于集中错误日志记录或告警的生命周期回调来支持错误处理。
处理 workflow 结果处理 workflow 结果的直接链接
运行 workflow 时,结果对象包含状态和发生的任何错误。
检查结果状态检查结果状态的直接链接
import { mastra } from './mastra'
const workflow = mastra.getWorkflow('myWorkflow')
const run = await workflow.createRun()
const result = await run.start({ inputData: { value: 'test' } })
switch (result.status) {
case 'success':
console.log('Workflow completed:', result.result)
break
case 'failed':
console.error('Workflow failed:', result.error)
break
case 'suspended':
console.log('Workflow suspended, waiting for resume')
break
}
结果对象结构结果对象结构的直接链接
结果对象包含:
status- workflow 状态:'success'、'failed'、'suspended'或'tripwire'result- workflow 输出(当状态为'success'时)error- 错误详情(当状态为'failed'时)steps- 各个步骤的结果及其状态和输出
访问步骤结果访问步骤结果的直接链接
你可以检查各个步骤的结果,以了解失败发生的位置:
const result = await run.start({ inputData: { value: 'test' } })
if (result.status === 'failed') {
// Find which step failed
for (const [stepId, stepResult] of Object.entries(result.steps)) {
if (stepResult.status === 'failed') {
console.error(`Step ${stepId} failed:`, stepResult.error)
}
}
}
生命周期回调生命周期回调的直接链接
对于需要在等待结果之外处理 workflow 完成情况的场景,例如后台作业、fire-and-forget workflows 或集中式日志记录,你可以使用生命周期回调。
生命周期回调会被等待,但它们不是持久的,也不会重试。对于必须可靠完成的工作,请使用 workflow steps。
onFinishonfinish的直接链接
当 workflow 以任意状态(success、failed、suspended 或 tripwire)完成时调用:
import { createWorkflow } from '@mastra/core/workflows'
import { z } from 'zod'
const orderWorkflow = createWorkflow({
id: 'order-processing',
inputSchema: z.object({ orderId: z.string() }),
outputSchema: z.object({ orderId: z.string(), status: z.string() }),
options: {
onFinish: async result => {
if (result.status === 'success') {
await db.updateOrderStatus(result.result.orderId, result.status)
}
await analytics.track('workflow_completed', {
workflowId: 'order-processing',
status: result.status,
})
},
},
})
onFinish 回调接收:
status- workflow 状态result- workflow 输出(成功时)error- 错误详情(失败时)steps- 各个步骤的结果tripwire- Tripwire 信息(如果状态为'tripwire')runId- 此 workflow 运行的唯一标识符workflowId- workflow 的标识符resourceId- 可选的资源标识符(如果创建运行时提供了)getInitData<any>()- 返回初始输入数据的函数mastra- Mastra 实例(如果 workflow 已注册到 Mastra)requestContext- 请求作用域的上下文数据logger- workflow 的 logger 实例state- workflow 的当前 state 对象
onErroronerror的直接链接
仅在 workflow 失败时调用(状态为 'failed' 或 'tripwire'):
import { createWorkflow } from '@mastra/core/workflows'
import { z } from 'zod'
const paymentWorkflow = createWorkflow({
id: 'payment-processing',
inputSchema: z.object({ amount: z.number() }),
outputSchema: z.object({ transactionId: z.string() }),
options: {
onError: async errorInfo => {
await alertService.notify({
channel: 'payments-alerts',
message: `Payment workflow failed: ${errorInfo.error?.message}`,
})
await errorTracker.capture(errorInfo.error)
},
},
})
onError 回调接收:
status-'failed'或'tripwire'error- 错误详情steps- 各个步骤的结果tripwire- Tripwire 信息(如果状态为'tripwire')runId- 此 workflow 运行的唯一标识符workflowId- workflow 的标识符resourceId- 可选的资源标识符(如果创建运行时提供了)getInitData<any>()- 返回初始输入数据的函数mastra- Mastra 实例(如果 workflow 已注册到 Mastra)requestContext- 请求作用域的上下文数据logger- workflow 的 logger 实例state- workflow 的当前 state 对象
同时使用两个回调同时使用两个回调的直接链接
你可以同时使用两个回调:
import { createWorkflow } from '@mastra/core/workflows'
import { z } from 'zod'
const pipelineWorkflow = createWorkflow({
id: 'data-pipeline',
inputSchema: z.object({ source: z.string() }),
outputSchema: z.object({ recordsProcessed: z.number() }),
options: {
onFinish: async result => {
// Always log completion
await logger.info('Pipeline completed', { status: result.status })
},
onError: async errorInfo => {
// Alert on failures
await pagerDuty.alert('Data pipeline failed', errorInfo.error)
},
},
})
回调中的错误处理回调中的错误处理的直接链接
回调内部抛出的错误会被捕获并记录,不会影响 workflow 的结果或导致其失败。因此,回调问题不会破坏你的生产 workflows。
options: {
onFinish: async (result) => {
// If this throws, it's logged but the workflow result is unchanged
await externalService.notify(result);
},
}
重试重试的直接链接
Mastra 为因瞬态错误而失败的 workflows 或步骤提供重试机制,例如当步骤与可能暂时不可用的外部服务或资源交互时。
使用 retryConfig 的 workflow 级配置使用-retryconfig-的-workflow-级配置的直接链接
你可以在 workflow 级别配置重试,这适用于 workflow 中的所有步骤:
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({...});
export const testWorkflow = createWorkflow({
retryConfig: {
attempts: 5,
delay: 2000
}
})
.then(step1)
.commit();
使用 retries 的步骤级配置使用-retries-的步骤级配置的直接链接
你可以使用 retries 属性为单个步骤配置重试。这会覆盖该特定步骤的 workflow 级重试配置:
import { createWorkflow, createStep } from '@mastra/core/workflows'
import { z } from 'zod'
const step1 = createStep({
execute: async () => {
const response = await fetch('example-url')
if (!response.ok) {
throw new Error('Error')
}
return {
value: '',
}
},
retries: 3,
})
条件分支条件分支的直接链接
你可以使用条件逻辑,根据前一步骤的成功或失败创建替代 workflow 路径:
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({
execute: async () => {
try {
const response = await fetch('example-url');
if (!response.ok) {
throw new Error('error');
}
return {
status: "ok"
};
} catch (error) {
return {
status: "error"
};
}
}
});
const step2 = createStep({...});
const fallback = createStep({...});
export const testWorkflow = createWorkflow({})
.then(step1)
.branch([
[async ({ inputData: { status } }) => status === "ok", step2],
[async ({ inputData: { status } }) => status === "error", fallback]
])
.commit();
检查前一步骤的结果检查前一步骤的结果的直接链接
使用 getStepResult() 检查前一步骤的结果。
import { createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({...});
const step2 = createStep({
execute: async ({ getStepResult }) => {
const step1Result = getStepResult(step1);
return {
value: ""
};
}
});
使用 bail() 提前退出使用-bail-提前退出的直接链接
在步骤中使用 bail() 以成功结果提前退出。它会将提供的 payload 作为步骤输出返回,并结束 workflow 执行。
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({
id: 'step1',
execute: async ({ bail }) => {
return bail({ result: 'bailed' });
},
inputSchema: z.object({ value: z.string() }),
outputSchema: z.object({ result: z.string() }),
});
export const testWorkflow = createWorkflow({...})
.then(step1)
.commit();
使用 Error() 提前退出使用-error-提前退出的直接链接
在步骤中使用 throw new Error() 以错误退出。
import { createWorkflow, createStep } from "@mastra/core/workflows";
import { z } from "zod";
const step1 = createStep({
id: 'step1',
execute: async () => {
throw new Error('error');
},
inputSchema: z.object({ value: z.string() }),
outputSchema: z.object({ result: z.string() }),
});
export const testWorkflow = createWorkflow({...})
.then(step1)
.commit();
## 使用 stream() 监控错误
你可以使用 stream 监控 workflows 的错误:
import { mastra } from '../src/mastra'
const workflow = mastra.getWorkflow('testWorkflow')
const run = await workflow.createRun()
const stream = await run.stream({
inputData: {
value: 'initial data',
},
})
for await (const chunk of stream.stream) {
console.log(chunk.payload.output.stats)
}