كيف يمكنني التقاط مكالمة fgetpos غير صالحة كاستثناء C++ على نظام التشغيل Windows؟

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

سؤال

في Visual C++ 2008، أريد "التقاط" الاستثناء الذي تم إنشاؤه كما هو موضح هنا:

try {
    int foo = 20;
    ::fgetpos(0, (fpos_t*)&foo);
}
//...

فيما يلي التعديلات التي أجريتها لمحاولة الصيد الناجح:

  1. تم تفعيل SEH (/eha)
  2. لقد أضفت علامة (...)
  3. لقد أضفت أ _set_se_translator المتجه.
  4. لقد قمت بإضافة/تعديل بناء جملة SEH:__حاول / __باستثناء (EXCEPTION_EXECUTE_HANDLER)

باختصار، لقد جربت "كل شيء في الكتاب" وما زلت لا أستطيع فهم الاستثناء.إذا قمت باستبدال المكالمة إلى ::fgetpos مع int hey = foo / 0 ثم فجأة تعمل جميع التقنيات المذكورة أعلاه كما هو متوقع.لذلك الاستثناء الذي أتعامل معه من ::fgetpos بطريقة أو بأخرى "خاصة جدًا".

هل يمكن لأي شخص أن يشرح لماذا يبدو هذا الخطأ ::fgetpos غير قابل للاكتشاف، وكيفية التغلب عليه؟

تحديث عند التنفيذ في VS IDE، لا تقوم نافذة الإخراج بتسمية استثناء.كل ما يقوله هو هذا:

اكتشفت مكتبة Microsoft Visual Studio C Runtime خطأً فادحًا في MyProgram.exe.

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

اسم حدث المشكلة:بيكس
إزاحة الاستثناء:0002fd30
رمز الاستثناء:c0000417
بيانات الاستثناء:00000000
معلومات إضافية 1:69 م
معلومات إضافية 2:69addfb19767b2221c8e3e7a5cd2f4ae
معلومات إضافية 3:b1ff
معلومات إضافية 4:b1ffca30cadddc78c19f19b6d150997f

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

المحلول

نظرًا لأن الكود الموجود في التفريغ الخاص بك يتوافق مع STATUS_INVALID_CRUNTIME_PARAMETER, ، يحاول _set_invalid_parameter_handler

نصائح أخرى

على الأرجح، يلتقطه وقت التشغيل نيابةً عنك ويصدر مربع حوار تصحيح الأخطاء دون إرجاع الاستثناء أو نشره - وهو استدعاء CRT وقد يضيفون أي استثناء يلتقط التعليمات البرمجية هناك كما يحلو لهم.من ضمن حقوق Visual Studio اكتشاف استثناء الأجهزة داخل وظيفة المكتبة، خصوصاً إذا كنت تقوم بالتشغيل من داخل IDE أو في وضع التصحيح، فهو كذلك مُتوقع من وقت التشغيل.

بالطبع، عند القسمة على صفر، فلن يكون هناك استدعاء للمكتبة هنا لكتابة رمز الالتقاط الإضافي هذا.

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