想了解一下try catch在php中的应用情况

是这样,我们公司之前的项目大多表单采集采用表单提交的形式,然后呢方法里用try catch的机制,这样的做法我觉得很不错。但是我本人表单提交喜欢用ajax,这里就是我用ajax好像用不了try catch这样的机制,因为我要返回状态码。
请问try catchphp中的应用范围?应用多吗?如果我用ajax想达到类似于try catch的机制可以做到吗


大概我所用的文字描述,有点迷惑,那我就来些数据说明一下

try catch机制,代码如下:

try {
    //这里接收一下表单数据 表单提交/ajax提交
    $admin_data = $this->input->post();
    if( empty( $admin_data['name'] ) ) throw new Exception( '用户名不能为空啊喂', 0 );
    if( empty( $admin_data['passwd'] ) ) throw new Exception( '密码也不能为空啊喂', 0 );
} catch ( Exception $e ) {
    init_messagebox( $e->getMessage(), 'error', $e->getCode() );
}

看上面的throw new Exception这个位置可以替换成 ajax_return()

funtion ajax_return($state, $msg) {
    exit(json_encode(array('state'=>$state, 'msg'=>$msg)));
}

好像就是说try catch的机制也是用if来判断的,if捕获错误信息(错误信息还是自己定义的),那我直接就用if ajax_return()这样的组合就好了。为什么还要写那么多代码呢?是这里不太明白

是我自身对try catch的机制了解的太浅薄了,所以可能问题有些让人疑惑,望解答

阅读 7.2k
9 个回答

看上去题主是前端在和PHP后端配合

我觉得你得先搞清楚ajax,http的概念,搞清楚js和php/后端语言的关系

服务端是不是try catch风格和你和服务端的整合没有任何关系

另外建议你先去学明白前后端分离,然后尽量说服php后端(尤其他们的leader)也学一下应用起来,感觉你们现在可能是form submit+前后端完全不分离的模式,这个模式很疼很坑而且很落后

返回不了状态码是不可能的,你应该是业务逻辑跳过了什么地方。使用 try catch 是良好的 OOP 风格的错误处理方式,应用广泛,在 PHP 的框架中也多有使用。

ajax最终还是会到一个php请求里吧 在这个请求里用try catch

我猜你可能是从一个异步的方法里直接获取了返回值,那个时候其实还没获取到呢。 跟TRY CATACH应该没关系。

try{
    ...
    $this->endSuccess();
}catch(\Exception $e){
    $this->endError();
}

额,可能一开始遇到的比较顺利,所以其实题主遇到的情况不是很能理解(因为我一开始接触就是别人封装好的框架,状态码及其他要返回的数据可以封装在endSuccess方法中,如果要用ajax就在try{}里做判断,对ajax提交的数据做判断即可)

参考Laravel
先定义异常处理器
set_error_handler
set_exception_handler
register_shutdown_function

然后在处理器里,判断是否是ajax请求
如果是ajax请求 ,返回固定的json格式

catch 到异常之后的处理由你来决定,并不一定要把异常throw出来,可以根据你的业务要求来定制json内容来返回、并且状态设置为异常号码。也可以修改http 状态码来做返回。

你们现在业务逻辑比较简单,所以可以在一个方法里面用ajax_return,但是在复杂逻辑中会出现模块A调用模块B,模块B调用模块C,这时候模块C出错了,你该怎么把错误传递给最初始调用的模块,这时候就可以通过try catch的机制去捕获更深层次调用的错误,在所有模块都是自己开发的情况下用ajax_return虽然也可以,但是当程序不是作为ajax的接口时呢,总不能也通过ajax_return进行返回吧,通过catch exception,可以让开发者统一的处理这些错误,它可以作为ajax接口返回,也能作为其他应用返回,只需要在捕获的时候做出特定的处理就行了,而且最重要的是,现在市面上大部分成熟的库都是抛出异常,让上层应用去进行错误处理,要想跟这些库兼容,利用好try catch机制是很有必要的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题