aio-lib-core-errors (英语)
这包含了所有 Adobe I/O Core Errors 的基础类. 将此作为所有 SDK 错误的错误类子类 .
这个模块的灵感来自Node.js如何创建自己的错误类.
安装
npm install @adobe/aio-lib-core-errors
建筑
AioCoreSDKERROR (英语)
这是所有错误类的基类,不应该直接被即时化. 创建自己的子类( 动态用法) 或使用以下的 ErrorWrapper( 静态用法) .
这个 message 财产 AioCoreSDKError 输出此格式中的错误 :
[SDK:ERROR_CODE] ERROR_MESSAGE
SDK是 SDK 名称ERROR_CODE是错误代码ERROR_MESSAGE是错误消息
注意 sdk details 未在信件中显示。 看见任何 sdk details中,您需要通过 .toJSON() (单位:千美元)JSON.stringify 也会通过引用来转换错误对象 .toJSON() 在错误对象上)
动态错误使用
// Adobe I/O Campaign Standard Wrapper
const { AioCoreSDKError } = require('@adobe/aio-lib-errors')
const gSDKDetails = {
// ... add your sdk details here
tenantId,
endpoint
}
const gSDKName = "AdobeIOCampaignStandard"
export default class CampaignStandardCoreAPIError extends AioCoreSDKError {
constructor(message, code) {
// the sdk name and sdk details are curried in as the 3rd and 4th parameters
super(message, code, gSDKName, gSDKDetails)
}
}
因此,如果我们有这种包装功能,我们改变如下:
function getAllProfiles (parameters) {
return new Promise((resolve, reject) => {
const apiFunc = 'getAllProfiles'
this.sdk.apis.profile[apiFunc]()
.then(response => {
resolve(response)
})
.catch(err => {
debug(err)
// >>>>>TO CHANGE<<<<<<<<<
reject(new Error(`${apiFunc} ${err}`))
})
})
}
改为:
function getAllProfiles (parameters) {
return new Promise((resolve, reject) => {
const apiFunc = 'getAllProfiles'
this.sdk.apis.profile[apiFunc]()
.then(response => {
resolve(response)
})
.catch(err => {
debug(err)
// >>>>>NEW<<<<<<<<<
reject(new CampaignStandardCoreAPIError(err.message /* error message */, apiFunc /* error code */))
})
})
}
如你所见,这不太直观,可能容易出错。 静态出错,我们可以做得更好(见下文).
静态错误
上面的例子使用是针对动态错误的,例如我们正在包起来的API错误. 静态错误要好得多:它们更能直观地使用,对代码可读性更好.
1. 通过 ErrorWrapper 创建您的错误类
我们定义我们的专业错误类, 错误代码在自己的模块中是这样的:
// SDKErrors.js
const { ErrorWrapper, createUpdater } = require('@adobe/aio-lib-core-errors').AioCoreSDKErrorWrapper
const codes = {}
const messages = new Map()
/**
* Create an Updater for the Error wrapper
*/
const Updater = createUpdater(
// object that stores the error classes (to be exported)
codes,
// Map that stores the error strings (to be exported)
messages
)
/**
* Provides a wrapper to easily create classes of a certain name, and values
*/
const E = ErrorWrapper(
// The class name for your SDK Error. Your Error objects will be these objects
'MySDKError',
// The name of your SDK. This will be a property in your Error objects
'MySDK',
// the object returned from the CreateUpdater call above
Updater
// the base class that your Error class is extending. AioCoreSDKError is the default
/* , AioCoreSDKError */
)
module.exports = {
codes,
messages
}
// Define your error codes with the wrapper
E('UNKNOWN_THING_ID', 'There was a problem with that thing')
E('UNKNOWN_ORDER_ID', 'There was a problem with that order id: %s.')
错误类打包器
让我们来解释一下这条线的意思:
E('UNKNOWN_ORDER_ID', 'There was a problem with that order id: %s.')
这将动态地创建一个 MySDKError 分类,对数值有适当的关闭:
- sdk 名称 (
MySDK,转到上面的 ErrorWrapper 构造器) - sdk 错误类名称 (
MySDKError,转到上面的 ErrorWrapper 构造器) - 错误代码( e)
UNKNOWN_ORDER_ID,第一个参数传递到E(中文(简体) ) - 错误消息( e)
There was a problem with that order id: %s.,第二个参数传递到E如果此字符串与format specifiers,可以在构建错误时通过格式描述符的参数。 见下文实例).
class MySDKError extends AioCoreSDKError { ... }
该行将添加动态创建 MySDKError 分类到导出 codes 对象,以包装符的第一个参数(错误代码)为键.
这个 constructor 对于创建的类,需要一个参数,一个对象:
constructor(parameters)
parameters(可选)是一个objectparameters.sdkDetails(可选)是一个object,作为 Error 对象的额外数据。 例如API呼叫的函数参数.parameters.messageValues(可选)是一个string, (中文(简体) ),number, (中文(简体) ),object或一个array如果信件有 格式描述符。 。 。 .
在下面的错误规格行中,可以看到它有一个格式的指定符 %s数字 :
E('UNKNOWN_ORDER_ID', 'There was a problem with that order id: %s.')
2. 使用您的错误分类
导入静态错误代码出错类, 并直接使用 .
const { UNKNOWN_THING_ID, UNKNOWN_ORDER_ID } = require('./SDKErrors').codes
// or, if you have too many codes to destructure:
// const { codes } = require('./SDKErrors')
const gSdkDetails = {
tenantId: 'mytenant'
}
// convoluted examples, but demonstrates usage
const unknownThing = true
if (unknownThing) {
throw new UNKNOWN_THING_ID({ sdkDetails: gSDKDetails })
}
const unknownOrderId = true
if (unknownOrderId) {
// messageValues can either be a string, object, etc or an array of them
throw new UNKNOWN_ORDER_ID({
sdkDetails: gSDKDetails,
messageValues: ['ORDER-2125SFG']
}) )
}
function getOrder(orderId) {
// we just wrap the function arguments as the sdkDetails
const sdkDetails = { orderId }
const somethingWentWrong = true
if (somethingWentWrong) {
// messageValues can either be a string, object, etc or an array of them
throw new UNKNOWN_ORDER_ID({
sdkDetails: sDKDetails,
messageValues: 'ORDER-2125SFGF'
}) )
}
}
getOrder('abc123')
示例控制台输出
打印出一个抛出 UNKNOWN_ORDER_ID 向控制台出错 . console 呼唤 .toString() 用于 Error 对象的方法,而生成的数据结构不完善,不会扩展嵌入对象:
try {
throw new UNKNOWN_ORDER_ID()
} catch (e) {
console.error(e)
}
输出 :
{ MySDKError: [MySDK:UNKNOWN_ORDER_ID] There was a problem with that order id: ORDER-21241-FSFS.
at new <anonymous> (/Users/obfuscated/aio-lib-core-errors/src/AioCoreSDKErrorWrapper.js:22:9)
at Object.<anonymous>.test (/Users/obfuscated/aio-lib-core-errors/test/MySDKError.test.js:50:15)
at Object.asyncJestTest (/Users/obfuscated/aio-lib-core-errors/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:102:37)
at resolve (/Users/obfuscated/aio-lib-core-errors/node_modules/jest-jasmine2/build/queueRunner.js:43:12)
at new Promise (<anonymous>)
at mapper (/Users/obfuscated/aio-lib-core-errors/node_modules/jest-jasmine2/build/queueRunner.js:26:19)
at promise.then (/Users/obfuscated/aio-lib-core-errors/node_modules/jest-jasmine2/build/queueRunner.js:73:41)
at process._tickCallback (internal/process/next_tick.js:68:7)
code: 'UNKNOWN_ORDER_ID',
sdk: 'MySDK',
sdkDetails: { tenantId: 'MYTENANT2' },
name: 'MySDKError' }
只需打印出一个掷出 UNKNOWN_ORDER_ID 错误对象 message 用于控制台的属性 :
try {
throw new UNKNOWN_ORDER_ID()
} catch (e) {
console.error(e.message)
}
输出 :
[MySDK:UNKNOWN_ORDER_ID] There was a problem with that order id: ORDER-21241-FSFS.
转换抛出 UNKNOWN_ORDER_ID 错误对象为JSON并打印到控制台. console 呼唤 .toJSON() 方法,并将扩展嵌入对象:
try {
throw new UNKNOWN_ORDER_ID()
} catch (e) {
console.error(JSON.stringify(e, null, 2))
}
输出 :
{
"sdk": "MySDK",
"sdkDetails": { "tenantId": "MYTENANT2" },
"code": "UNKNOWN_ORDER_ID",
"message": "[MySDK:UNKNOWN_ORDER_ID] There was a problem with that order id: ORDER-21241-FSFS.",
"stacktrace": "MySDKError: [MySDK:UNKNOWN_ORDER_ID] There was a problem with that order id: ORDER-21241-FSFS.\n at new <anonymous> (/Users/obfuscated/aio-lib-core-errors/src/AioCoreSDKErrorWrapper.js:22:9)\n at Object.<anonymous>.test (/Users/obfuscated/aio-lib-core-errors/test/MySDKError.test.js:50:15)\n at Object.asyncJestTest (/Users/obfuscated/aio-lib-core-errors/node_modules/jest-jasmine2/build/jasmineAsyncInstall.js:102:37)\n at resolve (/Users/obfuscated/aio-lib-core-errors/node_modules/jest-jasmine2/build/queueRunner.js:43:12)\n at new Promise (<anonymous>)\n at mapper (/Users/obfuscated/aio-lib-core-errors/node_modules/jest-jasmine2/build/queueRunner.js:26:19)\n at promise.then (/Users/obfuscated/aio-lib-core-errors/node_modules/jest-jasmine2/build/queueRunner.js:73:41)\n at process._tickCallback (internal/process/next_tick.js:68:7)"
}
探索
goto API 密码
捐款
欢迎捐款! 读取 贡献指南 更多信息.
许可证发放
这个项目根据Apache V2许可证获得许可. 见 自由主义 更多信息.
