it-swarm.asia

كيفية استخدام بكفاءة محاولة ... قبض على كتل في PHP

أستخدم try..catch blocks في الكود PHP ، لكنني لست متأكدًا مما إذا كنت أستخدمها بشكل صحيح.

على سبيل المثال ، يبدو بعض الكود الخاص بي:

 try {
      $tableAresults = $dbHandler->doSomethingWithTableA();
      $tableBresults = $dbHandler->doSomethingElseWithTableB();
 } catch (Exception $e) {
      return $e;
 }

لذلك أقوم بتجميع عمليات قاعدة بيانات متعددة في نفس كتلة try/catch لأنه في حالة حدوث أي استثناء في أي من المعاملات ، فسوف أكون قادرًا على التعامل معها.

أنا أفعل ذلك بهذه الطريقة لأنني أعتقد أنه أكثر قابلية للقراءة والكفاءة من:

 try {
       $tableAresults = $dbHandler->doSomethingWithTableA();
 } catch (Exception $e) {
       return $e;
 }
 try {
       $tableBresults = $dbHandler->doSomethingWithTableB();
 } catch (Exception $e) {
       return $e;
 }

على الرغم من أنني لست متأكدًا مما إذا كان ما أقوم به هو ممارسة جيدة أم أنه مجرد وسيلة كسول للوقوف على الاستثناءات.

أفترض أنه فقط إذا كان هناك استثناء يتطلب معالجة خاصة ، فيجب أن يكون لديه كتلة try/catch الخاصة به ، وإلا فإن تجميعها في try/catch نفسها يجب أن يكون على ما يرام.

لذلك سؤالي (أسئلتي):

هل هناك أي ميزة لاستخدام كتل try/catch لكل معاملة قاعدة بيانات؟ أو هل لا يزال بإمكاني تجميع معاملات قواعد بيانات متعددة في نفس كتلة try/catch دون أي مشكلة على الإطلاق؟

هل هو موافق عش كتل محاولة/الصيد؟ شكر!

تصحيح

بيان الإرجاع كان في المقام الأول لأغراض العرض التوضيحي فقط ، لكنني أستخدم أيضًا الإرجاع في catch() لأنني أقوم بطلب AJAX لهذا الأسلوب ، ويتوقع Javascript كائن JSON ، ثم إذا حدث استثناء أعود صفيف JSON مشفر فارغ. لقد اعتقدت أنه لن يضيف أي قيمة لوضع كود معين في مثالي.

74
ILikeTacos

ملاحظة مهمة

تفترض المناقشة التالية أننا نتحدث عن التعليمات البرمجية المنظمة كما هو موضح في المثال أعلاه: بغض النظر عن البديل الذي تم اختياره ، سيتسبب الاستثناء في توقف الطريقة المنطقية عن القيام بأي شيء كان في منتصفه.


طالما كنت تنوي القيام بنفس الشيء بغض النظر عن العبارة التي في كتلة try ، فهي استثناء ، فمن المؤكد أنه من الأفضل استخدام try/catch. فمثلا:

function createCar()
{
    try {
      install_engine();
      install_brakes();
    } catch (Exception $e) {
        die("I could not create a car");
    }
}

تعد كتل try/catch مفيدة إذا استطعت وتعتزم معالجة الفشل بطريقة محددة لما سببته بالضبط.

function makeCocktail()
{
    try {
        pour_ingredients();
        stir();
    } catch (Exception $e) {
        die("I could not make you a cocktail");
    }

    try {
        put_decorative_umbrella();
    } catch (Exception $e) {
        echo "We 're out of umbrellas, but the drink itself is fine"
    }
}
88
Jon

من أجل الأجيال القادمة ، قد يكون الجواب بعد فوات الأوان. يجب عليك التحقق من قيمة الإرجاع للمتغير ورمي استثناء. في هذه الحالة ، تكون متأكدًا من أن البرنامج سينتقل من حيث يتم رفع الاستثناء إلى كتلة catch. تجد أدناه.

try{
   $tableAresults = $dbHandler->doSomethingWithTableA();
   if (!tableAresults) 
     throw new Exception('Problem with tableAresults');

  $tableBresults = $dbHandler->doSomethingElseWithTableB();
   if (!tableBresults) 
     throw new Exception('Problem with tableBresults');
} catch (Exception $e) {
    echo $e->getMessage();

}
20
kodepet

لا يوجد سبب يمنع استخدام كتلة واحدة لعمليات متعددة ، لأن أي استثناء يتم طرحه سيمنع تنفيذ مزيد من العمليات بعد العملية الفاشلة. على الأقل طالما يمكنك استنتاج العملية التي فشلت من الاستثناء الذي تم اكتشافه. هذا طالما أنه على ما يرام إذا كانت بعض العمليات لا معالجتها.

ومع ذلك أود أن أقول أن عودة الاستثناء ليس له سوى معنى محدود. يجب أن تكون قيمة الإرجاع للدالة هي النتيجة المتوقعة لبعض الإجراءات ، وليس الاستثناء. إذا كنت بحاجة إلى الرد على الاستثناء في نطاق الاستدعاء ، فلا تدخل الاستثناء هنا داخل وظيفتك ، ولكن في نطاق الاستدعاء أو تعيد طرح الاستثناء للمعالجة اللاحقة بعد القيام ببعض تسجيل تصحيح الأخطاء وما شابه.

7
arkascha

انها أكثر قابلية للقراءة كتلة محاولة واحدة الصيد. إذا كان من المهم تحديد نوع من الخطأ أوصي تخصيص الاستثناءات الخاصة بك.

try {
  $tableAresults = $dbHandler->doSomethingWithTableA();
  $tableBresults = $dbHandler->doSomethingElseWithTableB();
} catch (TableAException $e){
  throw $e;
} catch (Exception $e) {
  throw $e;
}
7
zongo

عند طرح استثناء ، يتم إيقاف التنفيذ على الفور ويستمر في كتلة catch{}. هذا يعني أنه إذا قمت بإجراء مكالمات قاعدة البيانات في نفس كتلة try{} ورمت $tableAresults = $dbHandler->doSomethingWithTableA(); استثناءً ، فلن يحدث $tableBresults = $dbHandler->doSomethingElseWithTableB();. مع الخيار الثاني ، سيظل $tableBresults = $dbHandler->doSomethingElseWithTableB(); يحدث لأنه بعد كتلة catch{} ، عند استئناف التنفيذ.

لا يوجد خيار مثالي لكل موقف ؛ إذا كنت تريد أن تستمر العملية الثانية بغض النظر ، فيجب عليك استخدام كتلتين. إذا كان من المقبول (أو المرغوب فيه) عدم حدوث العملية الثانية ، فعليك استخدام واحدة فقط.

5
IanPudney
try
{
    $tableAresults = $dbHandler->doSomethingWithTableA();
    if(!tableAresults)
    {
        throw new Exception('Problem with tableAresults');
    }
    $tableBresults = $dbHandler->doSomethingElseWithTableB();
    if(!tableBresults) 
    {
        throw new Exception('Problem with tableBresults');
    }
} catch (Exception $e)
{
    echo $e->getMessage();
}
0
nitin kumar maurya

في كتلة try catch واحدة ، يمكنك القيام بكل شيء ، وأفضل الممارسات هي اكتشاف الخطأ في كتلة catch مختلفة ، إذا كنت تريد أن يظهر مع رسالته عن أخطاء معينة.

0
Amar Agrawal