-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathruntime-error.ts
More file actions
69 lines (54 loc) · 1.75 KB
/
runtime-error.ts
File metadata and controls
69 lines (54 loc) · 1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import { Problem } from './problem'
export class RuntimeError extends Error {
public name = 'RuntimeError'
public originalError?: Error
public errorFields: object[] = []
public constructor(errorOrMessage: Error | string)
public constructor(message: string, error: Error)
public constructor(message: string, error: Error, ...errorFields: object[])
public constructor(
errorOrMessage: Error | string,
error?: Error,
...errorFields: object[]
) {
const isErrorOrMessageString = typeof errorOrMessage === 'string'
const message = isErrorOrMessageString
? errorOrMessage
: errorOrMessage?.message
super(message)
this.originalError =
error || isErrorOrMessageString ? undefined : errorOrMessage
this.errorFields = errorFields
}
public toString() {
let name = this.name
const originalError = Problem.isRuntimeError(this.originalError)
? Problem.cause(this.originalError)
: this.originalError
if (originalError && !Problem.isRuntimeError(originalError)) {
name = `${name}: ${originalError.name}`
}
let message = this.message
let err = this.originalError
const fields = [...this.errorFields]
for (;;) {
if (!err) break
if (!Problem.isRuntimeError(err)) {
message += `: ${err.message}`
break
}
err = err.originalError
fields.push(...(err as RuntimeError).errorFields)
message += ` :${err!.message}`
}
const fieldObj = fields.reduce((acc, field) => {
acc = { ...acc, ...field }
return acc
}, {})
message = Object.entries(fieldObj).reduce((acc, [key, value]) => {
acc += ` ${key}: ${JSON.stringify(value)}`
return acc
}, message)
return `${name}: ${message}`
}
}