오류

2016-10-06 1 views
0

무엇 대신에이 코드 조각오류

function csv_file_generator($csvFilename, $delimiter = ";", $enclousure = '"') { 
    if(($csvHandler = fopen($csvFilename, 'rb')) === false) { 
     return; 
    } 

    while (($row = fgetcsv($csvHandler, 0, $delimiter, $enclousure)) !== false) { 
     yield $row; 
    } 

    if (feof($csvHandler) === false) { 
     return; 
    } 

    if (fclose($csvHandler) === false) { 
     return; 
    } 

    return; /* Exit Generator */ 
} 
+0

아마도 함수에 열려있는 filepointer 만 지정하고 함수에서 파일을 열지 않아야합니다. 그리고 예외에 대해 당신은 무엇을 했습니까 ?? 그것은 '누가 누구에게 사용하는지 알리는 가장 좋은 방법'이며 정보통에있는 사람 (개발자)이 무엇을해야 할지를 알고 있기 때문입니다. – JustOnUnderMillions

+0

@JustOnUnderMillions와 동의하십시오. 생성자는 파일을 열지 만 파일을 반복해서 처리하면 안됩니다. – RiggsFolly

+0

이 경우에 대한 문제 : 파일 없음, 잘못된 csv 형식, 인코딩 버그 ... 어떻게 모든 가능한 버그를 잡으시겠습니까? – JustOnUnderMillions

답변

1
<?php 
class CsvFileGenerator { 
    protected $fp; 
    protected $delimiter; 
    protected $enclousure; 
    public function __construct($filename, $delimiter = ";", $enclousure = '"'){ 
     $this->delimiter=$delimiter; 
     $this->enclousure=$enclousure; 
     if(!file_exists($filename)){ 
      throw new Exception("file [$filename] dont exists"); 
     } 
     if(!is_readable($filename)){ 
      throw new Exception("file [$filename] is not readable"); 
     } 
     $this->fp = fopen($filename, 'rb'); 
     if($this->fp === false){ 
      throw new Exception("cant open [$filename]"); 
     } 
    } 
    public function getGenerator(){ 
     while (($row = fgetcsv($this->fp, 0, $this->delimiter, $this->enclousure)) !== false) { 
      yield $row; 
     } 
    } 
    public function __destruct() { 
     if($this->fp){ 
      fclose($this->fp); 
     } 
    } 
} 

foreach((new CsvFileGenerator('mycsvfile.csv'))->getGenerator() as $line){ 
    #do some 
} 

한 가지 방법을 같이 예외를 이상한 수익을 작성하거나 양육의 뭔가 오류가 발생할 경우 내 생성 기능을 사용하는 사람 알리는 가장 좋은 방법은 로마. :-)

0

콜백은 어떻습니까?

function gen($i, $on_close = null, $on_error = null) { 
    while ($i--) { 
     yield $i; 

     if ($i === 5 && is_callable($on_close)) { 
      $on_close(); 
     } 
    } 
} 

$closed = false; 
$gen = gen(10, function() use (&$closed) { 
    $closed = true; 
}); 

foreach ($gen as $x) { 
    if ($closed) { 
     break; 
    } 

    echo $x, PHP_EOL; 
} 

나는 그다지 인정하지 않을 것이다. 또 다른 옵션은 특수 코드의 인스턴스를 반환하여 주 코드가 잘못된 것을 알 수 있도록하는 것입니다.