Hướng dẫn php ignore exception - php bỏ qua ngoại lệ

Bạn có thể, nhưng tôi sẽ cảnh báo: Nhiều người coi phương pháp này khá xấu xa.

// //stackoverflow.com/a/66377817/578023
function is_same[&$a, &$b]: bool {
    $_ = [ &$a, &$b ];
    return
        \ReflectionReference::fromArrayElement[$_, 0]->getId[] ===
        \ReflectionReference::fromArrayElement[$_, 1]->getId[];
}

function attempt_risky_action[$collection]{
    $cursor=NULL;
    $resuming = false;
    
    resume:
    try{
        foreach[$collection as $item]{
            if[$resuming && !is_same[$cursor,$item] ]{
                continue;                   // some things have better ways to skip ahead, especially an array index
            }
            else {
                $resuming = false;
                $cursor=&$item;             // main concept is to remember where you are in the iteration
            }                               // in some situation you may have to use references,  &item
            

            // your normal loop here
            .
            .
            .
        }
    }   catch[ Exception $e]{
        $resuming = repair_something[$e, $collection];      // returns false if your repair ran out of ideas
        if[$resuming]
            goto resume;
    }
    
    unset[$cursor];
    
}

Lý tưởng nhất là tốt nhất là kết thúc cuộc gọi unset[$cursor]; trong một khối finally{}, nhưng thật lòng mà nói, tôi không chắc làm thế nào chơi với Goto.

Nếu nó thực hiện vì Goto đã phá vỡ dòng chảy thì bạn sẽ cần một số logic có điều kiện, vì vậy con trỏ vẫn tồn tại. Nếu bạn có câu lệnh trả về bên trong vòng lặp, bạn phải sử dụng khối cuối cùng để gọi đến unset[$cursor] - hoặc gây rò rỉ bộ nhớ.

Sau đó, một lần nữa, trong khi ít thú vị hơn, bạn có thể thực hiện mánh khóe này bằng cách chỉ làm tổ toàn bộ vòng lặp của bạn trong do{ try/catch } while[$resuming]. Mặc dù điều đó không thực sự đảo ngược việc thực hiện của bạn, nhưng nó thực hiện chính xác hiệu ứng tương tự mà không có nguy cơ Goto.

is_same[] từ //stackoverflow.com/a/66377817/578023

function attempt_risky_action[$collection]{
    $cursor=NULL;
    $resuming = false;
    
    do{
        try{
            foreach[$collection as $item]{
                if[$resuming && !is_same[$cursor,$item] ]{
                    continue;   
                }
                else {
                    $resuming = false;
                    $cursor=&$item;
                }

                // your loop here
            }
        }   catch[ Exception $e]{
            $resuming = repair_something[$e, $collection];      // returns false if your repair ran out of ideas
        }
        finally{ 
            if[!$resuming]{
                unset[$cursor]; 
            }
        }
    } while[$resuming];
}

Một phương pháp cuối cùng, không hình; Bạn có thể sử dụng Php's ____10,

function attempt_risky_action[$collection]{
    $cursor=NULL;
    $resuming = false;
    
    do{
        try{
            foreach[$collection as $item]{
                if[$resuming && !is_same[$cursor,$item] ]{
                    continue;   
                }
                else {
                    $resuming = false;
                    $cursor=&$item;
                }

                // your loop here
            }
        }   catch[ Exception $e]{
            $resuming = repair_something[$e, $collection];      // returns false if your repair ran out of ideas
        }
        finally{ 
            if[!$resuming]{
                unset[$cursor]; 
            }
        }
    } while[$resuming];
}
1,
function attempt_risky_action[$collection]{
    $cursor=NULL;
    $resuming = false;
    
    do{
        try{
            foreach[$collection as $item]{
                if[$resuming && !is_same[$cursor,$item] ]{
                    continue;   
                }
                else {
                    $resuming = false;
                    $cursor=&$item;
                }

                // your loop here
            }
        }   catch[ Exception $e]{
            $resuming = repair_something[$e, $collection];      // returns false if your repair ran out of ideas
        }
        finally{ 
            if[!$resuming]{
                unset[$cursor]; 
            }
        }
    } while[$resuming];
}
2,
function attempt_risky_action[$collection]{
    $cursor=NULL;
    $resuming = false;
    
    do{
        try{
            foreach[$collection as $item]{
                if[$resuming && !is_same[$cursor,$item] ]{
                    continue;   
                }
                else {
                    $resuming = false;
                    $cursor=&$item;
                }

                // your loop here
            }
        }   catch[ Exception $e]{
            $resuming = repair_something[$e, $collection];      // returns false if your repair ran out of ideas
        }
        finally{ 
            if[!$resuming]{
                unset[$cursor]; 
            }
        }
    } while[$resuming];
}
3,
function attempt_risky_action[$collection]{
    $cursor=NULL;
    $resuming = false;
    
    do{
        try{
            foreach[$collection as $item]{
                if[$resuming && !is_same[$cursor,$item] ]{
                    continue;   
                }
                else {
                    $resuming = false;
                    $cursor=&$item;
                }

                // your loop here
            }
        }   catch[ Exception $e]{
            $resuming = repair_something[$e, $collection];      // returns false if your repair ran out of ideas
        }
        finally{ 
            if[!$resuming]{
                unset[$cursor]; 
            }
        }
    } while[$resuming];
}
4

Thay vào đó, những điều này sẽ cho phép bạn chỉ cần có khối thử/bắt bên trong một khối mã mà lặp lại dưới dạng vòng lặp - sau đó sử dụng

function attempt_risky_action[$collection]{
    $cursor=NULL;
    $resuming = false;
    
    do{
        try{
            foreach[$collection as $item]{
                if[$resuming && !is_same[$cursor,$item] ]{
                    continue;   
                }
                else {
                    $resuming = false;
                    $cursor=&$item;
                }

                // your loop here
            }
        }   catch[ Exception $e]{
            $resuming = repair_something[$e, $collection];      // returns false if your repair ran out of ideas
        }
        finally{ 
            if[!$resuming]{
                unset[$cursor]; 
            }
        }
    } while[$resuming];
}
1 trong Catch để thử lại.

Làm cách nào để bỏ qua các lỗi PHP?

Bỏ qua các lỗi PHP cho phép bạn có chọn lọc báo cáo lỗi khi bạn nghĩ rằng nó có thể xảy ra với cú pháp @. Do đó, nếu bạn muốn mở một tệp có thể không tồn tại và triệt tiêu bất kỳ lỗi nào phát sinh, bạn có thể sử dụng điều này: $ fp = @fopen [$ file, $ mode];$fp = @fopen[$file, $mode];

Mã có tiếp tục sau khi bắt PHP không?

Mã trong khối cuối cùng sẽ luôn được thực thi sau khi thử và bắt các khối, bất kể ngoại lệ có bị ném hay không, và trước khi thực hiện bình thường tiếp tục., regardless of whether an exception has been thrown, and before normal execution resumes.

Làm thế nào tôi có thể bắt được ngoại lệ trong PHP?

Bởi vì các ngoại lệ là các đối tượng, tất cả chúng đều mở rộng một lớp ngoại lệ tích hợp [xem các ngoại lệ ném vào PHP], điều đó có nghĩa là việc bắt mọi ngoại lệ PHP đều đơn giản như loại đối tượng ngoại lệ toàn cầu, được biểu thị bằng cách thêm dấu gạch chéo ngược vào phía trước: thử {// ...} Catch [\ ngoại lệ $ e] {// ...}type-hinting the global exception object, which is indicated by adding a backslash in front: try { // ... } catch [ \Exception $e ] { // ... }

PHP có thể ném là gì?

Có thể ném có thể ném là giao diện cơ sở cho bất kỳ đối tượng nào có thể được ném qua một câu lệnh ném, bao gồm lỗi và ngoại lệ. Lưu ý: Các lớp PHP không thể triển khai giao diện có thể ném trực tiếp và thay vào đó phải mở rộng ngoại lệ.the base interface for any object that can be thrown via a throw statement, including Error and Exception. Note: PHP classes cannot implement the Throwable interface directly, and must instead extend Exception.

Tôi đang làm việc này:

try
{
    $result=100/0;
}
catch[Exception $e]
{
    $result=0;
}

Tôi đang nhận được sự phân chia theo không ngoại lệ:

CẢNH BÁO: Bộ phận theo Zero

Nhưng tôi muốn thực hiện kết quả bằng không khi ngoại lệ xảy ra. Tôi làm nó như thế nào. Cảm ơn,

Hỏi ngày 17 tháng 12 năm 2013 lúc 9:42Dec 17, 2013 at 9:42

3

Thay vì nắm bắt ngoại lệ [mặc dù như được ghi nhận bởi Tlenss, bạn đang nhận được cảnh báo] và bỏ qua nó [vì bạn có thể bỏ lỡ các trường hợp ngoại lệ quan trọng khác xem xét kiểm tra bộ phận trước.

$divisor = 0;
$num = 100;
if[$divisor]{
    $result=100/0;
}else{
    $result = 0;
}

Đã trả lời ngày 17 tháng 12 năm 2013 lúc 9:48Dec 17, 2013 at 9:48

JimjimJim

22.1k6 Huy hiệu vàng52 Huy hiệu bạc80 Huy hiệu Đồng6 gold badges52 silver badges80 bronze badges

Bạn có thể sử dụng ErrorException để ném các cảnh báo/lỗi PHP làm ngoại lệ:

function exception_error_handler[$errno, $errstr, $errfile, $errline ] {
    if [ 'Division by zero' == $errstr] {
        throw new ErrorException[$errstr, 0, $errno, $errfile, $errline];
    }
}
set_error_handler["exception_error_handler"];

try
{
    $result=100/0;
}
catch[Exception $e]
{
    $result=0;
}

echo $result;

Đã trả lời ngày 17 tháng 12 năm 2013 lúc 9:52Dec 17, 2013 at 9:52

BitworkbitworkingbitWorking

12.3k1 Huy hiệu vàng31 Huy hiệu bạc38 Huy hiệu đồng1 gold badge31 silver badges38 bronze badges

Bài Viết Liên Quan

Chủ Đề