@@ -25,14 +25,30 @@ let installed = false;
|
||||
|
||||
// Причиной отклонения может быть что угодно, не только Error — у PnPjs это
|
||||
// бывает объект с полями ответа. Разбираем по факту, а не по ожиданию.
|
||||
function describeReason(reason: unknown): string {
|
||||
if (reason instanceof Error) return `${reason.name}: ${reason.message}`;
|
||||
if (typeof reason === 'string') return reason;
|
||||
//
|
||||
// Отдельно разобраны случаи, из-за которых раньше в отчёт уходила пустая
|
||||
// строка. Промис можно отклонить вообще без причины (`Promise.reject()`), и
|
||||
// тогда reason === undefined: JSON.stringify возвращает на нём НЕ строку, а
|
||||
// undefined, из-за чего сообщение схлопывалось в пустоту и по отчёту нельзя
|
||||
// было понять даже того, что причины не было вовсе.
|
||||
export function describeReason(reason: unknown): string {
|
||||
if (reason === undefined) return 'промис отклонён без причины (reject без аргумента)';
|
||||
if (reason === null) return 'промис отклонён значением null';
|
||||
if (reason instanceof Error) {
|
||||
return `${reason.name}: ${reason.message || '(пустое сообщение)'}`;
|
||||
}
|
||||
if (typeof reason === 'string') return reason || '(пустая строка)';
|
||||
if (typeof reason !== 'object') return `${typeof reason}: ${String(reason)}`;
|
||||
|
||||
// Тип объекта указываем всегда: у PnPjs/SharePoint по одному имени класса
|
||||
// (HttpRequestError и т.п.) уже понятно, куда смотреть.
|
||||
const kind = (reason as { constructor?: { name?: string } }).constructor?.name || 'Object';
|
||||
try {
|
||||
return JSON.stringify(reason);
|
||||
return `${kind}: ${JSON.stringify(reason)}`;
|
||||
} catch {
|
||||
// Циклические ссылки — тогда хотя бы тип.
|
||||
return Object.prototype.toString.call(reason);
|
||||
// Циклические ссылки (внутри ошибок PnPjs лежит Response) — тогда хотя бы
|
||||
// перечислим ключи: по ним видно, что это за объект.
|
||||
return `${kind}: {${Object.keys(reason as object).join(', ')}}`;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user