【问题标题】:How to get all console error messages in Angular application如何在 Angular 应用程序中获取所有控制台错误消息
【发布时间】:2019-09-24 08:19:52
【问题描述】:

我正在开发一个角度应用程序,问题是当我想在某些智能电视上调试它时,没有调试模式,并且在后台我有一些导致应用程序崩溃的错误,那么,有什么办法吗获取所有错误消息并将其打印在我的应用程序页面的一部分中?

实际上我想在我自己的应用程序中拥有某种虚拟控制台。

非常感谢

【问题讨论】:

  • 你想要传达的内容叫做logging 搜索如何在 Angular 中记录消息
  • 您将需要使用您在服务中选择的方法替换您的控制台日志。如何在您的应用程序中显示它们取决于您。您可以使用固定的浮动面板或快餐栏消息。我建议您使用某种服务来集中您的日志,并使其可以从您应用中的任何位置访问。

标签: javascript angular console-application


【解决方案1】:

有几种调试方法:

  • Console.log() - 这会将您的消息输出到控制台。不知道你是否可以在电视上看到它。
  • 创建一个全局错误处理程序,如Angular documentation 中提供的那样

如果上述方法不起作用,您可以尝试使用此解决方案,我不久前在互联网上的某个地方使用snackbar 组件发现了该解决方案,该组件将错误显示为弹出窗口:

error.service.ts:

import { Injectable } from '@angular/core';
import { HttpErrorResponse } from '@angular/common/http';

@Injectable({
    providedIn: 'root'
})
export class ErrorService {

    checkOnline()
    {
        if (!navigator.onLine) {
            return 'No Internet Connection';
        }
    }

    getClientMessage(error: Error): string {
        return error.message ? error.message : error.toString();
    }

    getClientStack(error: Error): string {
        return error.stack;
    }

    getServerMessage(error: HttpErrorResponse): string {
        var msg = error.error.Message;
        if (!!msg)
            return msg + " : " + error.error.ExceptionMessage;
        return "Application can not execute because API hasn\'t been started";
    }

    getServerStack(error: HttpErrorResponse): string {
        return error.error.StackTrace;
    }
}

global-error-handler-component.ts:

import { ErrorHandler, Injectable, Injector } from '@angular/core';
import { HttpErrorResponse } from '@angular/common/http';
import { ErrorService } from './services/error.service';
import { MatSnackBar } from '@angular/material';

@Injectable()
export class GlobalErrorHandler implements ErrorHandler
{
    constructor(private injector: Injector, public snackBar: MatSnackBar) { }

    handleError(error: Error | HttpErrorResponse)
    {
        const errorService = this.injector.get(ErrorService);
        let message;
        let stackTrace = errorService.getClientStack(error);

        if (error instanceof HttpErrorResponse) // Server Error
            message = errorService.getServerMessage(error);
        else // Client Error
            message = errorService.getClientMessage(error);

        this.snackBar.open(message, 'X', { panelClass: ['error'] });
    }
}

app.module.ts:

import { GlobalErrorHandler } from './global-error-handler.component';
import { MatSnackBarModule } from '@angular/material/snack-bar';
...
  imports: [
...
    MatSnackBarModule,
...
  ],
  providers: [
...
    { provide: ErrorHandler, useClass: GlobalErrorHandler },
...

【讨论】:

    【解决方案2】:

    您可以覆盖console.error 方法并创建像间谍一样的smoeth

    @Injectable({
        providedIn:'root'
    })
    export class ConsoleSpyService {
      private errorStack :any[] = []
      constructor() { 
        const errMethod = console.error;
    
        console.error= (...args) => { 
          this.errorStack.push(args);
    
          errMethod(`?`,...args)
        }
    
        Object.freeze(console)
      }
    
    
      get errorList() {
        return this.errorStack;//.slice(0);
      }
    }
    

    你需要注入这个类以便它创建

    export class AppModule {
    
      constructor(c:ConsoleSpyService){}
    
     }
    

    在组件中注入服务

      constructor(private conSpyServ:ConsoleSpyService) {
    
      }
    
      get errors(){
        return this.conSpyServ.errorList;
      }
    

    模板(显示错误列表)

    <div class="errors" *ngFor="let error of errors">
      {{error.join(' ')}}
    </div>
    

    您可以通过在 ConsoleSpyService 类中注释此行 errMethod(?,...args) 来将日志记录显示到控制台浏览器

    demo ??

    【讨论】:

    • 其实我想得到系统错误不是我在console.error中做的,我的意思是从模块抛出异常
    • @malbarmavi 你能解释一下这个'Object.freeze(console)'吗?它会做什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多