معالجة الاستثناءات - تم تخطي السطر وSQL فارغ

StackOverflow https://stackoverflow.com/questions/869579

  •  22-08-2019
  •  | 
  •  

سؤال

إيد = VS7 أو 2002

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

لقد تأكدت من أن الدليل الظاهري يستخدم ASP.NET 1.0.3705.

يتبع الكود وأشرح ما يظهره لي مصحح الأخطاء كخطوات التنفيذ في التعليقات:

try
{
    objConnection.Open();  // STARTS HERE
    objCommand.ExecuteNonQuery();  // DOES NOT THROW EXCEPTION
    int c = 0;  // THIS LINE IS EXECUTED
}
catch (SqlException sqle)
{

    LogError();  // THIS LINE IS NOT EXECUTED
    throw sqle;  // THIS LINE IS EXECUTED AFTER THE int c = 0; 
                 // sqle IS NULL
                 // EXCEPTION IS NOT CAUGHT AND 
                 // EXECUTION CONTINUES IN FINALLY BLOCK
}
finally
{
    // EXECUTES AS EXPECTED FROM HERE ON OUT,
    // AS THOUGH THE throw sqle; DID NOT HAPPEN.
    if (objConnection.State == ConnectionState.Open) objConnection.Close();
}

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

أظن أن SQL فارغ وهذا هو السبب في أن الرمية لا تتصرف كما هو متوقع.ولكن لماذا قفزنا إلى كتلة التعليمات البرمجية هذه في المقام الأول؟

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

شكرا لكم جميعا لمساعدتكم!

أتمنى لك كل خير،

جراهام

هل كانت مفيدة؟

المحلول

انتظر..الكود الخاص بك لا يطرح استثناءً وأنت تتساءل لماذا لا ينفذ كتلة الالتقاط؟

تعديل (بالإشارة إلى تعليقك):

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

هل حاولت التحقق من تدفق البرنامج باستخدام تقنيات تصحيح الأخطاء القديمة (Debug.WriteLine) وتخطي مصحح الأخطاء؟

افتراضي هو أنك تنظر إلى المكان الخطأ حيث يتم طرح الاستثناء..أو ليس هناك استثناء على الإطلاق.

نصائح أخرى

وغريب جدا. لست متأكدا ما يحدث مع التعليمات البرمجية الخاصة بك، ولكن شيئا واحدا رأيته هو استخدام:

catch (SqlException sqle)
{

    LogError();  // THIS LINE IS NOT EXECUTED
    throw sqle;  // THIS LINE IS EXECUTED AFTER THE int c = 0; 
                 // sqle IS NULL
                 // EXCEPTION IS NOT CAUGHT AND 
                 // EXECUTION CONTINUES IN FINALLY BLOCK
}

وأنت تريد أن تكتب:

catch (SqlException sqle)
{

    LogError(); 
    throw; 
}

لإعادة رمي الاستثناء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top