بايثون XMLRPC:التعامل مع الاستثناءات التعسفية من جانب العميل

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

  •  20-09-2019
  •  | 
  •  

سؤال

أحاول تمرير استثناءات تعسفية من خادم XMLRPC إلى العميل (يتم تعريف كلا البرنامجين النصيين لـ Python وأنواع الاستثناءات على كلا الجانبين).هناك تنفيذ مثالي من جانب العميل في وصفات ActiveState الذي يوزع "faultString" التي تم إرجاعها، ويقارنها بقائمة من الاستثناءات المعروفة، وإذا تم العثور عليها، فإنه يرفع هذا الاستثناء (بدلاً من تغليفه في ملف xmlrpclib.Fault).

مثال على استجابة استثناء XMLRPC:

<?xml version='1.0'?>
<methodResponse>
  <fault>
    <value>
      <struct>
        <member>
          <name>faultCode</name>
          <value>
            <int>1</int>
          </value>
        </member>
        <member>
          <name>faultString</name>
          <value>
            <string>ValueError:</string>
          </value>
        </member>
      </struct>
    </value>
  </fault>
</methodResponse>

تقوم وصفة ActiveState بتقسيم سلسلة "ValueError:" ومقارنة "ValueError" مع ValueError.__name__ (وهو في allowed_errors = [ValueError, TypeError], ، راجع.الرابط أعلاه).

هل من الممكن أن تمر الجميع استثناءات مثل هذا، أي.رفع أي استثناء تلقائيًا (مشتق من Exception أو بعض الفئات الأساسية الأخرى) من جانب العميل (بعد أن تم طرحه على الخادم)؟

يعمل البرنامج النصي ActiveState، لكنني لا أرغب في تسجيل كل استثناء استطاع يتم طرحها (يجب أن تكون في allowed_errors).

(السؤال مكافأة:هل هناك تقنية أخرى غير XMLRPC يمكنها التعامل مع هذه المشكلة بشكل صحيح؟بايرو؟)

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

المحلول

يمكنك ملء allowed_errors قائمة من __builtins__:

[exc for exc in __builtins__ if isinstance(exc, BaseException)]

وهذا من شأنه أن يتعامل مع الحالة الشائعة، للاستثناءات المضمنة مثل ValueError, TypeError, OSError, ، إلخ.ربما يمكنك القيام بشيء أكثر تقدمًا مثل PyYAML وpickle، حيث يقومان تلقائيًا بمطاردة أي استثناء مُشار إليه يتم إرساله، ولكن هذا يعرض نفسك لهجمات ضارة.

إذا كنت تريد نوع شفافية العميل/الخادم الذي يتضمنه رفع الاستثناءات تلقائيًا من الخادم على العميل، فمن المحتمل أن يكون Pyro خيارًا أفضل من XML-RPC.

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