@sentry/browser
@sentry/node
raven-js
raven-node
_ïŒããŒãã®ã¬ã€ãŽã³ïŒ_@angular/core
5.7.1 (@sentry/browser)
8.2.11 (@angular/core)
ã°ããŒãã«ErrorInterceptorã䜿çšããAngularã¢ããªã®åæèšå®ããããŸã
ããã«ç§ããããéãæ¹æ³
const eventId = Sentry.captureException(error.originalError || error);
Sentry.showReportDialog({ eventId });
ãããŠãç§ã¯ãã®ïŒããŒã§ãã£ããã£ããããšã©ãŒä»¥å€ã®äŸå€ïŒãšã©ãŒãããããŒãã¡ãã»ãŒãžãååãOKïŒãšã©ãŒãäœåºŠãåãåãã説æããäœãééã£ãŠããã®ãããããŠãããåçŸããæ¹æ³ãç解ã§ããŸããã
ããã¯ãæäŸãããªããžã§ã¯ãããAngularã¢ããªã®ã¹ã¿ãã¯ãã¬ãŒã¹ãä¿æããError
ã€ã³ã¹ã¿ã³ã¹ã§ã¯ãªãããšãæå³ããŸãã
ïŒã¡ãã»ãŒãžã瀺ãããã«ïŒå¿
èŠã«å¿ããŠSentry.captureException(error.error)
ãŸãã¯Sentry.captureException(error.message)
䜿çšããå¿
èŠããããŸãã
@kamilogorek oh okïŒtnx
@kamilogorekã¯ãããã§ããã®ãšã©ãŒãçºçããŸã
const exception = error.error || error.message || error.originalError || error;
const eventId = Sentry.captureException(exception);
+1ãã©ã®ããã«é 眮ããŠããã®ãšã©ãŒãçºçããŸãã
sentry.error-handler.ts
export class SentryErrorHandler extends GeneralErrorHandler {
...
handleError(error) {
...
const exception = error.originalError || error.error || error
Sentry.captureException(exception)
}
}
package.json
{
...
"@angular/core": "^8.2.11",
"@sentry/browser": "^5.7.1",
...
}
ç§ã¯ãããããããšã«ããŸãã
Sentry.init({
dsn: environment.sentryUrl,
beforeSend(event, hint) {
/* tslint:disable:no-string-literal only-arrow-functions */
const isNonErrorException =
event.exception.values[0].value.startsWith('Non-Error exception captured') ||
hint.originalException['message'].startsWith('Non-Error exception captured');
/* tslint:enable:no-string-literal only-arrow-functions */
if (isNonErrorException) {
// We want to ignore those kind of errors
return null;
}
return event;
}
});
@gchronosã®åé¿çãããããšãããããŸãïŒ è¿ããã¡ã«ä¿®æ£ã®å¯èœæ§ãããããšãé¡ã£ãŠããŸãã
ç§ããããã®ãšã©ãŒãçºçããŠãããšèšã£ãŠãã£ã€ã ã鳎ãããŸãã ç§ã¯Angular8ã䜿çšããŠããŸãããããã«é¢ããå€ãã®åé¡ãèªãã åŸããšã©ãŒåŠçã³ã³ããŒãã³ãã§ãšã©ãŒãé©åã«åŠçããŠããªãå¯èœæ§ãããããšã«æ°ä»ããŸããã ç§ã¯captureExceptionã«æž¡ãããåã«äŸå€ãå®çŸ©ããä»ã®äººã«ãã£ãŠææ¡ãããåé¿çãè©ŠããŸããããããã¯ãšã©ãŒãæžãããŸããã§ããã 誰ããããã«ã€ããŠããã«æèŠãè¿°ã¹ãããšãã§ããã°çŽ æŽããããšæããŸãããããªããšãGChronosã®ïŒããããšãïŒïŒãœãªã¥ãŒã·ã§ã³ã䜿çšããå¿ èŠããããŸãã
+1
+1
誰ããããããããã°ããããã«äœ¿çšã§ããåçŸãæäŸã§ããŸããïŒ ããŒã¹ã®angular-cliã¢ããªã䜿çšããããšããŸãããããã®åäœãåçŸã§ããŸããã ããããšãïŒ
@kamilogorekæ°ããAngular8ãããžã§ã¯ããéå§ãã500ãè¿ããšã³ããã€ã³ãã«åããŠhttpãªã¯ãšã¹ããè¡ããhttpãµãŒãã¹ã§ãšã©ãŒããã£ããããªããããSentryã«äŒæã§ãããšæããŸãã
ç§ã¯ããã€ãã®ããå€ãã®æ å ±ã§ãã£ã€ã ããããšãã§ããŸããããã¯ç§ãã¡ã®ErrorHandlerã§ãïŒ
@Injectable()
export class SentryErrorHandler implements ErrorHandler {
constructor() { }
handleError(error) {
Sentry.captureException(error.originalError || error.error || error);
}
}
ã»ã³ããªãŒãã©ããã³ã°ã§ã¯ããããã®ã€ãã³ãã«å¯ŸããŠåžžã«éè€ããã€ãã³ããçºçããŸãã
ïŒä»ã®ã€ãã³ãã¯ãªã¹ãã®1ã€ã®é ç®ãšããŠåé¡ãªãå ±åãããŸãïŒ
ãããã®ãNon.Errorãã€ãã³ããæ°çŸååéããŸããããèå³æ·±ãããšã«ãããããã¹ãŠã«å ±éãããã®ã¯æ¬¡ã®ãšããã§ãã
ãããŠããšã©ãŒã¯äž»ã«æ¬¡ã®ãšããã§ãã
{
error: [Object],
headers: [Object],
message: Http failure during parsing for https://foo.bar/baz,
name: HttpErrorResponse,
ok: False,
status: 200,
statusText: OK,
url: https://foo.bar/baz
}
ããããŸãããSentryErrorHandlerã泚å
¥å¯èœã«ããextendsã®ä»£ããã«ErrorHandlerãå®è£
ããŸãããããã®ãããªåé¡ã¯ãããããŸããã
ã ããç§ã¯ããå€æŽããŸãã
export class SentryErrorHandler extends ErrorHandler {
constructor() {
super();
}
handleError(err: any): void {
if (environment.production === true || environment.preprod === true) {
Sentry.captureMessage(err.originalError || err);
}
throw err;
}
}
ã«
@Injectable()
export class SentryErrorHandler implements ErrorHandler {
constructor() { }
handleError(err: any): void {
if (environment.production === true || environment.preprod === true) {
Sentry.captureException(err.originalError || err);
}
throw err;
}
}
æåã®èšå®ã¯2幎éåé¡ãªãè¡ãããŸããããAngular 8ã«ã¢ããã°ã¬ãŒãããŠãããããã€ãã®æ©åšã®äŸå€ããããŸãã
@ jonathan-payiqããã®åå ãèŠã€ããããšãã§ããŸãããïŒ ãããšãããããã®ãšã©ãŒä»¥å€ã®äŸå€ããã¹ãŠç¡èŠããŸããïŒ
çŸåšãããããç¡èŠããŠããŸãã
ãã¬ããã¯ã©ã ããããããã¯Webãã¥ãŒ/ãã©ãŠã¶ãŒãããã¯ã°ã©ãŠã³ãïŒé衚瀺ïŒã«ãããšãã«çºçããããšãããã£ããããä¿®æ£ã¯ãããŒãžã衚瀺ãããŠããªããšãã«ãã§ãããçºçããªãããã«ããããšã§ãã ã©ãããSamsungãã©ãŠã¶ã¯ããã¯ã°ã©ãŠã³ãã§ãããã¯ãŒã¯ã®æŽæ°ãããŸãåŠçããŸããã
@ jonathan-payiqã©ã®ãããæ£ç¢ºã«ããããç¡èŠããŠããŸããïŒ åãã£ãŠæè¬ããŸãã
çŸåšã以äžã䜿çšããŠç¡èŠããŠããŸãã
Sentry.init({
ignoreErrors: [
'Non-Error exception captured'
]
});
@kamilogorekåé¡ãåçŸã§ããŸãããïŒ
å
ã®åé¡ãéšåçã«è§£æ±ºãããããæå¹ãªè§£æ±ºçãããããã«æããããããåé¡ã解決ããŸãã ããã§ãåé¡ã解決ããªãå Žåã¯ã誰ãã«æ°ãã説æãä»ããŠæ°ããåé¡ãäœæããŠããããããšæããŸãã
ããã§ãé¢é£æ§ãããå Žåã¯ãé æ
®ãªãpingããŠãã ãããåãã§åéããäœæ¥ãè¡ããŸãã
也æ¯ïŒ
解決ãããŠããŸããã SentryãAngular8ãšçµ±åããããšãããšããããã®åé¡ãèŠã€ãããŸããã
ã»ã³ããªãŒãç®±ããåºããŠããã«ã»ããã¢ããã䞻匵ã§ããæ¹æ³ãããããŸãããããã¯å®å šã«èª€ãã§ãã
ã»ã³ããªãŒãç®±ããåºããŠããã«ã»ããã¢ããã䞻匵ã§ããæ¹æ³ãããããŸãããããã¯å®å šã«èª€ãã§ãã
@Rushã¯åçŸå¯èœãªã±ãŒã¹ãæäŸããŸããããã§ã¯ãäœãåé¡ãªã®ãã説æããŠç€ºãããã®åŸãç§ãã¡ã¯ããªãã®äž»åŒµãæ€èšŒããããšãã§ããŸãã
@kamilogorekçå®ã¯ã6ãæ以äžAngularã䜿çšããŠããªãããã確èªããã®ã«ååãªã¬ããŒããããã«ãããããIMOã§ããã«åçŸããå¿ èŠã¯ãªããèªåã§ç°¡åã«èŠã€ããããšãã§ããŸãã Angular v8ããããŠçŸåšã¯v9ïŒãœãŒã¹ããããªãïŒã䜿çšããŠãããããžã§ã¯ãã§ãåãåé¡ãçºçããŠãããããããã§ã¯ãªãããšãç§ã¯ç¥ã£ãŠããŸãã
æ£ç¢ºã«ããããŠç§ã¯ç§ã®ããã«ä»äºãããããã«ã»ã³ããªãŒã«ãéãæã£ãŠããŸãã æãæ±ãããšãæåŸ ããŠãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§ã¯ãããŸããã
ç§ã¯ã»ã³ããªãŒã奜ãã§ããã代ãããæ¢ãããšãã§ããŸãã...
äŸãšããŠhttps://github.com/gothinkster/angular-realworld-example-appã¢ããªã䜿çšããŸãã
ãã¢ããŒã³ã¯ããŒã³ã¢ããªã¯ãSentryã®Angularããã¥ã¡ã³ãã«åŸãããœãŒã¹ããããã¢ããããŒãããŸããã çµæã¯æ¬¡ã®ãšããã§ãã
Angularããšã©ãŒãã³ãã©ãŒã§æäŸãããã®+ãã£ããã£ããã€ãã³ãïŒ
UIã§ã®å€èŠ³ïŒ
泚ïŒAngularã¯Error
ãªããžã§ã¯ãå
šäœãåŠçã§ããããããã¹ãŠãæŽã£ãŠããã®ã§ãå£ããã³ãŒãã®æ£ããè¡ãç°¡åã«æãããšãã§ãããšã©ãŒã¡ãã»ãŒãžãšãšã©ãŒã¿ã€ãã¯æ£ããã§ãã
Angularããšã©ãŒãã³ãã©ãŒã§æäŸãããã®+ãã£ããã£ããã€ãã³ãïŒ
UIã§ã®å€èŠ³ïŒ
泚ïŒAngularã¯ãã®æ å ±ãæäŸããªããããã©ã®ã¿ã€ãã®ãšã©ãŒãã¹ããŒãããããç¥ãæ¹æ³ã¯ãããŸããã ãã ããã·ãªã¢ã«åãããããŒã¿ãèŠããšãã404 NotFoundããšã©ãŒãçºçããããšãããããŸããããã¯ãç¡å¹ãªXHRåŒã³åºããåå ã§ããå¯èœæ§ãé«ãã§ãã 次ã«ããã¬ããã¯ã©ã ãããŒã調æ»ããŠãæå®ãããURLïŒãã®å Žåã¯ã¿ã€ããã¹ãå«ãŸããŠããŸãïŒãžã®XHRåŒã³åºããããããã®åã«æ£ç¢ºãªDOMèŠçŽ ãã¯ãªãã¯ããŠããªã¬ãŒããããšã確èªã§ããŸãã ãã®æ å ±ãããã°ã99ïŒ ã®ã±ãŒã¹ã§åé¡ã解決ããã®ã«ååãªã¯ãã§ãã
ãã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠäžãããããã®ã§ã®ã¿äœæ¥ã§ããŸãã ãã以å€ã®å Žåã¯ããã¬ãŒã ã¯ãŒã¯èªäœã«ã¢ã³ããŒããããé©çšããå¿ èŠããããŸãã
ãã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠäžãããããã®ã§ã®ã¿äœæ¥ã§ããŸãã ãã以å€ã®å Žåã¯ããã¬ãŒã ã¯ãŒã¯èªäœã«ã¢ã³ããŒããããé©çšããå¿ èŠããããŸãã
ããã¯ãç§ãã¡ã®åé¡ã§ã¯ãªãããšããããªãã®èšãæ¹ã§ããïŒ ïŒäžéšã®ç«¶åä»ç€Ÿããã®ïŒæ©åšã«åãæ¿ããåã«ããããã®XHRãšã©ãŒã¯åé¡ãªããã£ããã£ãããè§åºŠãšã©ãŒãã³ãã©ãŒã䜿çšããåãã€ã³ã¹ããŒã«æ¹æ³ã䜿çšããŠããŸããã
ãã³ããŒãšããŠã®@kamilogorekã¯ããã¬ãŒã ã¯ãŒã¯ã§ãã±ãããéãããšãã§ããŸãã ãã£ãšæ³šç®ããããšæããŸãã
ïŒäžéšã®ç«¶åä»ç€Ÿããã®ïŒæ©åšã«åãæ¿ããåã«ããããã®XHRãšã©ãŒã¯åé¡ãªããã£ããã£ãããè§åºŠãšã©ãŒãã³ãã©ãŒã䜿çšããåãã€ã³ã¹ããŒã«æ¹æ³ã䜿çšããŠããŸããã
@szechyjsã¯ããªãŒãã³ãœãŒã¹ã®SDKã§ãããç§ãã¡ãäœãç®æããŠããããããã£ãŠããã°ãæ¹åãç¹°ãè¿ãããšãã§ããã®ã§ã代ããã«ãœãªã¥ãŒã·ã§ã³ãå ±æã§ããã°çŽ æŽããããšæããŸãã
...ãã¬ãŒã ã¯ãŒã¯ã§ãã±ãããéãããšãã§ããŸãã ãã£ãšæ³šç®ããããšæããŸãã
æ©åšãµããŒãä»ãã®ãã±ãããéããŠããã®åé¡ãåç §ããŸããã
ããã®éè¡äººã ç§ã®å Žåãreact nativeã§åŠçãããæåŠãå ±åãããã®ã§ãããOPãšåããšã©ãŒã衚瀺ãããŸããã the object you provide is not an instance of Error
ã以äžã䜿ã£ãŠåé¿ããŸããã
export interface IError extends Error {
code?: ErrorCode
msg?: string
}
export const appError = (code: ErrorCode, msg: string = ''): IError => {
const errmsg = `code: ${code}, msg: ${msg}`
const err: IError = new Error(errmsg)
err.code = code
err.msg = msg
err.name = 'appError'
return err
}
ããããç§ã¯é»è©±ããŸã
export const logError = (err: Error) => {
sentry.captureException(err)
}
ãªãã»ã©
ã圹ã«ç«ãŠãã°ïŒ
ç§ã®å ŽåãSentryã®Breadcrumbsã»ã¯ã·ã§ã³ã¯ãåå ãç¹å®ããã®ã«å€§ãã«åœ¹ç«ã¡ãŸããã ããã¯äž»ã«ãäžéšã®å€éšAPIã«404ãå«ãŸããŠããå Žåã«çºçããŸããã
ããã¥ã¡ã³ãã®æŽæ°ãšå¿ èŠãªJSSDKã®å€æŽãäºå®ãããŠããŸãã
https://github.com/getsentry/sentry-docs/pull/1695/
https://github.com/getsentry/sentry-javascript/pull/2601
ä»é±ãªãªãŒã¹ãããã¯ãã§ãïŒ :)
ããã®ç°¡åãªä¿®æ£ïŒããã¯HTTPã€ã³ã¿ãŒã»ãããšã©ãŒã§ã®ã¿çºçããããïŒïŒ
handleError(error: Error | HttpErrorResponse | any) {
// ...
if (error.constructor.name === "HttpErrorResponse") {
error.error.Message + " (" + error.message + ")";
error = error.error;
}
// ...
Sentry.captureMessage(err.originalError || err.error || error);
throw err;
}
æ°ããããã¥ã¡ã³ããš5.16.0
ããªãªãŒã¹ãããŸãã-httpsïŒ//docs.sentry.io/platforms/javascript/angular/
ç§ã¯ãããã§ããã ãæ確ã§è©³çŽ°ã«ããããšããŸããããããŠããããããå€ãã®ã³ãŒãã®ããã«ãèŠãããããããªããçç±ã§ãã
@kamilogorekç§ãVueã¢ããªã§ãã®åé¡ãæ±ããŠããŸãã ãããã«ä¿®æ£ã¯ãããŸããïŒ
ãã£ã¡ãäžç·ã äŸå€ã¯ãvuejsæ©åšçµ±åãšã©ãŒãã³ãã©ãŒã§ã¹ããŒãããŸãã
https://sentry.io/share/issue/eaf13a2455e04150aaaab595d0d7bafe/
@sblawrieæ£ç¢ºã«ã©ã®ãããªåé¡ããããŸããïŒ è©³çŽ°ãæããŠãã ããã
@cincauhangusã³ãŒãã®ã©ããã§ãpromiseã€ã³ã¹ã¿ã³ã¹èªäœã§ãšã©ãŒãã¹ããŒããŠããããã«èŠããŸãïŒ abort, always, catch, done
ããŒã«æ³šæããŠãã ããïŒã
äœãã®ãããªãã®ïŒ
const promise = new Promise((resolve, reject) => (...));
// somehow somewhere in the code
function foo () {
// ...
throw promise
}
ãããã£ãŠãVueã®errorHandler
ã¯ã Error
ã€ã³ã¹ã¿ã³ã¹ã§ãããšæ³å®ãããpromiseãªããžã§ã¯ãå
šäœãååŸããŠããŸãã
@kamilogorek説æããŠãããŠããããšãã ããã€ãå€æŽãå ããŸããããããã§ãåé¡ãçºçãããã©ãããç£èŠããŸãã
Angular 8ã䜿çšããŠããŠãåãåé¡ã§ãšã©ãŒä»¥å€ã®äŸå€ãçºçããŸããã äŸã®ãextractErrorãã³ãŒãã次ã®ããã«å€æŽããŸããã
private static extractError(error: any) {
// Try to unwrap zone.js error.
// https://github.com/angular/angular/blob/master/packages/core/src/util/errors.ts
if (error && error.ngOriginalError) {
error = error.ngOriginalError;
}
// We can handle messages and Error objects directly.
if (typeof error === 'string' || error instanceof Error) {
return error;
}
// If it's http module error, extract as much information from it as we can.
if (error instanceof HttpErrorResponse) {
// The `error` property of http exception can be either an `Error` object, which we can use directly...
if (error.error instanceof Error) {
return error.error;
}
// ... or an`ErrorEvent`, which can provide us with the message but no stack...
if (error.error instanceof ErrorEvent) {
return error.error.message;
}
// ...or the request body itself, which we can use as a message instead.
if (typeof error.error === 'string') {
return `Server returned code ${error.status} with body "${error.error}"`;
}
// If we don't have any detailed information, fallback to the request message itself.
return error.message;
}
// ***** CUSTOM *****
// The above code doesn't always work since 'instanceof' relies on the object being created with the 'new' keyword
if (error.error && error.error.message) {
return error.error.message;
}
if (error.message) {
return error.message;
}
// ***** END CUSTOM *****
// Skip if there's no error, and let user decide what to do with it.
return null;
}
äžèš@untilinviteã®beforeSendäŸã«åºã¥ããŠç§ã®Sentry.init beforeSendãä¿®æ£ããŸããã ãã®å€æŽã¯ã httpsïŒ//github.com/getsentry/sentry-javascript/issues/2169ããã®2çªç®ã®ãã°ã¡ãã»ãŒãžãåŠçããããã®ãã®ã§ããããéãšã©ãŒãšããŠè§£æ±ºãããŸãã
Sentry.init({
dsn: AppConfig.envSettings.sentryDSN,
maxBreadcrumbs: 50,
environment: this.getEnvName(),
integrations: [new Sentry.Integrations.Breadcrumbs({ console: false })],
beforeSend(event, hint) {
// Note: issue with double entries during http exceptions: https://github.com/getsentry/sentry-javascript/issues/2169
// Note: issue with a second entry not being set correctly (as a non-error): https://github.com/getsentry/sentry-javascript/issues/2292#issuecomment-554932519
const isNonErrorException = event.exception.values[0].value.startsWith('Non-Error exception captured');
if (isNonErrorException) {
if (!event.extra.__serialized__) {
return null;
}
let realErrMsg = event.extra.__serialized__.error ? event.extra.__serialized__.error.message : null;
realErrMsg = realErrMsg || event.extra.__serialized__.message;
// this is a useless error message that masks the actual error. Lets try to set it properly
event.exception.values[0].value = realErrMsg;
event.message = realErrMsg;
}
return event;
}
});
5.16.0
ãªãªãŒã¹ã§ããã¥ã¡ã³ãã«è¿œå ãããå€æŽãå ããŸãããããŸã Non-Error exception captured with keys: error, headers, message, name, ok
ãšã©ãŒãçºçããŠããŸãã @ sentry / angularããã±ãŒãžã§ãããã®åé¡ãä¿®æ£ãããããšãæåŸ
ããŠããŸããïŒ
AngularïŒv9.1
ã»ã³ããªãŒïŒv5.20
@szechyjs httpã€ã³ã¿ãŒã»ãã¿ãŒã«é¢ãã2çªç®ã®éšåãèªã¿ãŸãããïŒ ããã¯éåžžããšã©ãŒãæ£ããæ€åºãããªãããã«ããäž»ãªåé¡ã§ã-https ïŒ//docs.sentry.io/platforms/javascript/angular/
@szechyjs httpã€ã³ã¿ãŒã»ãã¿ãŒã«é¢ãã2çªç®ã®éšåãèªã¿ãŸãããïŒ ããã¯éåžžããšã©ãŒãæ£ããæ€åºãããªãããã«ããäž»ãªåé¡ã§ã-https ïŒ//docs.sentry.io/platforms/javascript/angular/
ã€ã³ã¿ãŒã»ãã¿ãŒã¯äœ¿çšããŠããŸããã
ããã«ã¡ã¯ãç§ã¯ãã®åé¡ã«ãã°ããæéãè²»ãããŸããããã¿ã€ãHttpErrorResponse
ãšã©ãŒã®error.error.message
ã«ã¯ãå¿
ãããæ
å ±ãå«ãŸããŠããªãããšãããããŸããã ã³ã³ã¹ãã©ã¯ã¿ãŒãèŠããšãAngularãã¡ãã»ãŒãžpropãErrorEvent
ã§ã¯ãªãã«ãŒããªããžã§ã¯ãã«èšå®ããŠããããšãããããŸãã
ãã®è¡ãå€æŽããããšã§https://github.com/getsentry/sentry-javascript/blob/8eb72865dcd62ff719441105c7eda28007a07e9d/packages/angular/src/errorhandler.ts#L112
ã«
if (error.error instanceof ErrorEvent && error.error.message)
ãšã©ãŒãã³ãã©ã¯return error.message;
é²ã¿ãäºæããããšã©ãŒãã¹ããŒããŸããã
çŽ æŽããããã£ãã@jakkn ãããããšãïŒ PRã®æŽæ°ããããã³ãã©ãŒhttps://github.com/getsentry/sentry-javascript/pull/2903
ç¶æ¿ããã°ããã®Expressã¢ããªã§ãã®åé¡ãçºçããŠããŸãã ãããã©ã®ããã«çºçãããã¯ããããŸããããã¢ããªãã¹ããŒããã»ãšãã©ã®ãšã©ãŒã§çºçããŠããããã§ããããã¥ã¡ã³ãã®æšæºã®Expressã»ããã¢ããã䜿çšããŠããŸãã
äŸïŒ https ïŒ
ãšã¯ã¹ãã¬ã¹ãªã¯ãšã¹ããã³ãã©ãŒçšã§ãããAngularã§ã¯ãããŸããã§ãããããããšåããšã©ãŒãçºçããŸããã åºæ¬çã«ãErrorãªããžã§ã¯ãã®ä»£ããã«pojoã䜿çšããŠnext
ãåŒã³åºããŠããŸããã ç§ã¯èªåã®ãšã¯ã¹ãã¬ã¹ãšã©ãŒãã³ãã©ãŒã§ããã€ãã®æ¥œããããšãããŠããããèå³æ·±ããã®ã«å€ããŠããŸãããsentryioãªã¯ãšã¹ãããã«ãŠã§ã¢ãæåã«å®è¡ãããããããã®ããŒã·ã£ãªã³ã°ãšã©ãŒã¯çºçããŸããã§ããã
æåŸã«ãæäŸããããã®ãããåççãªãã®ã«å€ãããŠãŒãã£ãªãã£é¢æ°ãäœæããŸããã
export const handleMaybeError = err => {
if (err instanceof Error) return err
const newErr = new Error(err.message || 'unexpected')
for (const [key, value] of Object.entries(err)) {
newErr[key] = value
}
return newErr
}
export const someController = (req, res, next) => {
try {
await handleResponse(req, res)
} catch (err) {
next(handleMaybeError(err))
}
}
ããã¯ç§ãæãã«ã¹ã¿ãã¯ãã¬ãŒã¹ãæ··ä¹±ãããŸãããããå®éã«ãããããã«æž¡ãããããžã§ã§ãã£ããªãã°ããšã«ããã¹ã¿ãã¯ãã¬ãŒã¹ã¯ãããŸããã§ããã
ç§ãã¡ã®äŸã§ã¯ããããä¿®æ£ãããåã¯ãå ±åãããã€ãã³ãã®å€§éšåã¯ãã®ç¹å®ã®åé¡ã«é¢ãããã®ã§ãããé·æéå®è¡ãããããŒãWebãµãŒããŒã§ããããããã¬ããã¯ã©ã ã¯ã»ãšãã©åœ¹ã«ç«ããããã¹ãŠã®ãšã©ãŒããã®1ã€ã®ã€ãã³ãã¿ã€ãã«ãŸãšããããŸãã
constäŸå€= error.error || error.message || error.originalError || ãšã©ãŒ;
ããã¯true / falseã«è©äŸ¡ãããŸã
constäŸå€= error.error || error.message || error.originalError || ãšã©ãŒ;
ããã¯true / falseã«è©äŸ¡ãããŸã
å¯èœæ§ã¯äœãã§ãããå¯èœã§ãã ããã¯ãã¹ãŠãã¹ããªãŒã ã«éä¿¡ããããšã©ãŒãã«åž°çããŸãã ãããçµå±ã®ãšãããããã«ã¯ããçš®ã®æçšãªæ å ±ãå«ãŸããŠããã¯ãã§ãã
æãåèã«ãªãã³ã¡ã³ã
çŸåšã以äžã䜿çšããŠç¡èŠããŠããŸãã