CI 묻고 답하기

제목 에러처리 관련질문드립니다.
글쓴이 치혼혈귀 작성시각 2013/07/15 17:37:39
댓글 : 14 추천 : 0 스크랩 : 0 조회수 : 18912   RSS
 정규식 관련 php함수은 preg_match 함수를 사용했을때 

정규식 형태에 맞지않는 것에 대해 에러처리를 해주려합니다.

하지만 codeigniter 는 try catch 가안되어

에러박스만 뜰뿐 

그 에러가 발생했을 시  어떻게 처리해야할지 모르겠네요.

무슨 대안 없을까요?
태그 예외,try catch,에러,처리
 다음글 파일업로드가 두개라면, (5)
 이전글 /ci 에 설치할경우 (1)

댓글

한대승(불의회상) / 2013/07/15 18:11:25 / 추천 0
어떻게 했는지 알 수가  없어 도움드리기가 참 힘드네요.
치혼혈귀 / 2013/07/16 09:14:27 / 추천 0
 아래의 이미지처럼, 고의적으로 잘못된 정규식을 넣었을때 이러한 메시지 박스가 나타나는데 제가원하는것은 이런오류가 나타났을 때, 이런 박스대신에 false, true, 혹은 메시지로 성공,실패 이런식으로 하길 원합니다.

하지만 찾아본바로는 저런 메시지 박스를 error_reporting(0); 로 없앨 수 있긴한데, 제가원하는 메시지를 받질 못합니다.  try catch가 안먹어서요.  

강제적으로 exception을 던져줘야 되긴한데 아래처럼 자연스러운 구문오류일때가 문제입니다.
한대승(불의회상) / 2013/07/16 11:08:42 / 추천 0
이 문제는 CI에서 처리를 못하는게 아니라 PHP가 다른 방식으로 처리 하기 때문입니다.
이렇게 하시면 해결 됩니다.

모든 경고 메시지는 이 함수를 통하게 된다는게 함정....

set_error_handler("warning_handler", E_WARNING);

function chk_name($exString)
{
 $test = preg_match($exString, "PHP is the web scripting language of choice.");

 return $test;
}

function warning_handler($errno, $errstr) {
 echo 'Message:' . $errstr;
}

echo chk_name("//sfsdf//");

치혼혈귀 / 2013/07/16 15:03:11 / 추천 0
오 신기하게 진짜로 메시지가 나오네요

적용시켜보고 다른거에 어떤 영향을받을진 아직모르지만

일단 정말 감사드립니다.!

운영진짱짱맨
치혼혈귀 / 2013/07/17 10:25:11 / 추천 0
재질문 드리겠습니다 .

위의 답변대로 해보니 일반 php로는 잘되는데,

ci의 컨트롤러에서 사용하니 먹히질 않습니다.

ci에서는 다른방법이있나요?
한대승(불의회상) / 2013/07/17 11:39:55 / 추천 0
ㅎㅎㅎ 항상 소스는 빼 놓는군요.. ^^
치혼혈귀 / 2013/07/17 13:04:58 / 추천 0
 소스 별다른건 없습니다.  컨트롤러에 

ex) 컨트롤러명이 abc 일때

function index(){
                                set_error_handler("warning_handler", E_WARNING);
function chk_name($exString)
{
$test = preg_match($exString, "PHP is the web scripting language of choice.");
return $test;
}
 
function warning_handler($errno, $errstr) {
echo 'Message:' . $errstr ;
}
 
echo chk_name("//PHP//");
}

이런식으로 놓고 localhost/abc 로 실행시켰을 때 입니다.

변종원(웅파) / 2013/07/17 13:18:42 / 추천 0
ci index.php에 상수 ENVIRONMENT 가 development로 되어 있는가 확인해보세요.

E_WARNING 자체가 막혀있을 수 있습니다.
치혼혈귀 / 2013/07/17 13:20:56 / 추천 0
 development 로설정되어있구요\

define('ENVIRONMENT', 'development');
/*
 *---------------------------------------------------------------
 * ERROR REPORTING
 *---------------------------------------------------------------
 *
 * Different environments will require different levels of error reporting.
 * By default development will show errors but testing and live will hide them.
 */
 
if (defined('ENVIRONMENT'))
{
switch (ENVIRONMENT)
{
case 'development':
error_reporting(E_ALL);
break;
case 'testing':
case 'production':
error_reporting(0);
break;
 
default:
exit('The application environment is not set correctly.');
}
}

production 으로하면 아에오류메시지가 출력안되는데 

제가원하는 건 오류(예외)가 발생했을시, 어떠한 값으로 받길 원하거든요

false라던지, "실패" 라는 문자라던지 

그걸로인해 예외처리가 났을 때, 일정 동작을 실행하지못하게 하기위한 목적입니다
변종원(웅파) / 2013/07/17 13:57:36 / 추천 0
ci 에러로그 남기는걸 좀 변형해도 될거 같네요.

core에 Exceptions.php라는 라이브러리가 하나 있습니다.

거기서 로그파일로 쓰거나 화면에 출력하는등 제어를 합니다.

그 파일을 확장해서 특정 메세지는 show_php_error()함수처럼 화면에 출력하도록 해주면 될거 같네요.
치혼혈귀 / 2013/07/17 14:09:02 / 추천 0
 음.. 그부분에 대해서는 생각하고 있었긴한데,

컨트롤러 부분으로 특정 값을 Exceptions.php 에서 보낼 수가 있을까요?

변종원(웅파) / 2013/07/17 14:23:38 / 추천 0
http://codeigniter-kr.org/user_guide_2.1.0/general/errors.html

Exceptions.php 내부의 함수를 그대로 사용합니다.
한대승(불의회상) / 2013/07/17 14:48:21 / 추천 0
ㅎㅎㅎ 소스코드대로 하면 당연히 안되겠죠.. ^^

이렇게 해보세요.

왜 안됐을까요? 아래처럼 하면 왜 될까요? ^^

set_error_handler("warning_handler", E_WARNING);
function warning_handler($errno, $errstr) {
        echo 'Message:' . $errstr ;
}

class Welcome extends CI_Controller {
 public function index()
 {
                echo $this->chk_name("//PHP//");
  $this->load->view('welcome_message');
 }

        function chk_name($exString)
        {
                $test = preg_match($exString, "PHP is the web  scripting language of choice.");
                return $test;
        }
}



치혼혈귀 / 2013/07/17 17:50:24 / 추천 0
 일단 제가 처리한 형식은 Exceptions.php 를 살짝만져서, 

특정 오류발생시, 세션을 생성하고,

컨트롤러에서 그 세션값을 받아 처리하는 식으로 처리하였습니다. 달아주신 댓글방법도 

한번씩 해보도록하겠습니다.  관심과, 답변 정말 감사합니다!!