异常处理是软件开发过程中无法回避的问题。对于代码设计良好、效率高的程序来说,出现异常的可能性会比较低,但这并不代表不会出现异常,有些异常甚至会造成严重的后果,那么如何发现和处理异常在节目中的及时性就变得非常重要。通常,我们可以依靠用户的反馈,经常查看程序日志来发现程序的问题。但这要么不靠谱,要么不及时,那么我们介绍一种更有效的方法——使用Slack来通知程序跑完的异常信息。Slack是一个即时通讯软件,类似于QQ,它提供了一个开放的API,可以调用它向你团队中指定的个人或频道(Channel)发送消息,所以非常适合用它来做异常通知。maknz/slack-laravel包的具体安装方法可以参考Github上的[readme](https://github.com/maknz/slack-laravel)。配置安装完成后,使用phpartisanvendor:publish生成config\slack.php 配置文件,然后在.env文件中添加如下三个配置值```SLACK_ENDPOINT=//slackterminal,即slack接口地址SLACK_CHANNEL=//消息默认接收通道SLACK_USERNAME//消息默认接收者'''>当然也可以直接对应config\slack.php中配置的默认值,而不是使用.env,但不推荐这样做。>根据实际需要设置SLACK_CHANNEL和SLACK_USERNAME。两者都没有必要。调整AppExceptionsHandler类的report方法,实现Slack通知异常信息的逻辑。代码如下:/***报告或记录异常。**这是向Sentry、Bugsnag等发送异常的好地方**@param\Exception$e*@returnvoid*/publicfunctionreport(Exception$e){if($this->shouldReport($e))){$slackMessage="\n[错误。{$e->getCode()}]{$e->getMessage()}";$slackMessage.="\n[Line.{$e->getLine()}]{$e->getFile()}";$slackMessage.="\n[Time]".date('Y-m-dH:i:s');尝试{Slack::to(config('slack.channel'))->send($slackMessage);}catch(\Exception$eOther){\Log::info($slackMessage);}}returnparent::report($e);}对于一些可能经常出现但并不致命的异常,比如404NotFoundHttpException,我们可能不希望程序通知它。为此,我们只需要在Aop\Exceptions\Handler类中的$dontReort属性中添加指定的异常类型即可。protected$dontReport=[NotFoundHttpException::class,//...];例子展示了发送信息到指定的频道(channel),当然你也可以发送给指定的人,或者其他更复杂的用法。但是请注意,指定的用户名和频道在你自己的slackteam中已经存在,否则会报错。这样当程序出现异常时,运维可以第一时间收到相关的通知信息,便于及时处理。
