diff options
author | Remco Bloemen <remco@wicked.ventures> | 2018-12-21 07:31:13 +0800 |
---|---|---|
committer | Leonid Logvinov <logvinov.leon@gmail.com> | 2019-01-11 18:26:38 +0800 |
commit | 7af0818dffe67483491f99062071b582fba456cb (patch) | |
tree | 514f8b32b3e7d2d30cab326652bcc3e3f95e62e0 /packages/sol-tracing-utils/src/trace_collection_subprovider.ts | |
parent | 296b3d6311186c7444d9d6763f8ee2d3c373dc14 (diff) | |
download | dexon-0x-contracts-7af0818dffe67483491f99062071b582fba456cb.tar dexon-0x-contracts-7af0818dffe67483491f99062071b582fba456cb.tar.gz dexon-0x-contracts-7af0818dffe67483491f99062071b582fba456cb.tar.bz2 dexon-0x-contracts-7af0818dffe67483491f99062071b582fba456cb.tar.lz dexon-0x-contracts-7af0818dffe67483491f99062071b582fba456cb.tar.xz dexon-0x-contracts-7af0818dffe67483491f99062071b582fba456cb.tar.zst dexon-0x-contracts-7af0818dffe67483491f99062071b582fba456cb.zip |
Capture errors in next callbacks
Diffstat (limited to 'packages/sol-tracing-utils/src/trace_collection_subprovider.ts')
-rw-r--r-- | packages/sol-tracing-utils/src/trace_collection_subprovider.ts | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/packages/sol-tracing-utils/src/trace_collection_subprovider.ts b/packages/sol-tracing-utils/src/trace_collection_subprovider.ts index 25e38768d..8b4ea82f5 100644 --- a/packages/sol-tracing-utils/src/trace_collection_subprovider.ts +++ b/packages/sol-tracing-utils/src/trace_collection_subprovider.ts @@ -20,6 +20,24 @@ export interface TraceCollectionSubproviderConfig { shouldCollectGasEstimateTraces: boolean; } +type AsyncFunc = (...args: any[]) => Promise<void>; + +// This wrapper outputs errors to console even if the promise gets ignored +// we need this because web3-provider-engine does not handler promises in +// the after function of next(after). +function logErrors(fn: AsyncFunc): AsyncFunc { + async function wrapped(...args: any[]): Promise<void> { + try { + await fn(...args); + } catch (e) { + // tslint:disable-next-line no-console + console.error(e); + throw e; + } + } + return wrapped; +} + // Because there is no notion of a call trace in the Ethereum rpc - we collect them in a rather non-obvious/hacky way. // On each call - we create a snapshot, execute the call as a transaction, get the trace, revert the snapshot. // That allows us to avoid influencing test behaviour. @@ -74,7 +92,7 @@ export abstract class TraceCollectionSubprovider extends Subprovider { next(); } else { const txData = payload.params[0]; - next(this._onTransactionSentAsync.bind(this, txData)); + next(logErrors(this._onTransactionSentAsync.bind(this, txData))); } return; @@ -83,7 +101,7 @@ export abstract class TraceCollectionSubprovider extends Subprovider { next(); } else { const callData = payload.params[0]; - next(this._onCallOrGasEstimateExecutedAsync.bind(this, callData)); + next(logErrors(this._onCallOrGasEstimateExecutedAsync.bind(this, callData))); } return; @@ -92,7 +110,7 @@ export abstract class TraceCollectionSubprovider extends Subprovider { next(); } else { const estimateGasData = payload.params[0]; - next(this._onCallOrGasEstimateExecutedAsync.bind(this, estimateGasData)); + next(logErrors(this._onCallOrGasEstimateExecutedAsync.bind(this, estimateGasData))); } return; |