تحميل الصورة من عنوان URL - كيفية التقاط الاستثناء إذا كانت الصورة ليست موجودة

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

سؤال

مشكلتي تتعلق سؤال آخر لقد طلبت عن تحميل صورة من عنوان URL. وبعد الكود أدناه يعمل. ومع ذلك، فقد واجهت المشكلة إذا حاولت الحصول على الصورة (فمن المفترض أن تكون هناك) ولكن يبدو أنه تمت إزالته. التطبيق لا يعرف وإرجاع الخطأ. هل هناك طريقة لمنع ذلك عن طريق التقاط خطأ وارد. وأود أن أقدر أي اقتراحات. يحدث ذلك في خطه:

 IdHTTP1.get('http://www.google.com/intl/en_ALL/images/logo.gif',MS);

شكرا كريس

uses
  GIFImg;

 procedure TForm1.btn1Click(Sender: TObject);
 var
   MS : TMemoryStream;
   GIf: TGIFImage;
 begin
     MS := TMemoryStream.Create;
    GIf := TGIFImage.Create;
   try
    IdHTTP1.get('http://www.google.com/intl/en_ALL/images/logo.gif',MS);
    Ms.Seek(0,soFromBeginning);       
   Gif.LoadFromStream(MS);
   img1.Picture.Assign(GIF);

  finally
   FreeAndNil(GIF);
   FreeAndNil(MS);
  end;
end;
هل كانت مفيدة؟

المحلول

كيف يمكنك التقاط الاستثناء؟ بنفس الطريقة التي يمكنك التقاطها أي استثناء آخر. إستخدم try-except منع.

procedure TForm1.btn1Click(Sender: TObject);
var
  MS : TMemoryStream;
  Gif: TGIFImage;
begin
  MS := TMemoryStream.Create;
  try
    Gif := TGIFImage.Create;
    try
      try
        IdHTTP1.Get('http://www.google.com/intl/en_ALL/images/logo.gif', MS);
      except
        on e: EIdHTTPProtocolException do begin
          if e.ErrorCode = 404 then begin
            // not found
            exit;
          end else begin
            // some other reason for failure
            raise;
          end;
        end;
      end;
      MS.Position := 0;
      Gif.LoadFromStream(MS);
      img1.Picture.Assign(Gif);
    finally
      Gif.Free;
    end;
  finally
    MS.Free;
  end;
end;

عندما يحصل Indy على استجابة غير مقبولة، فإنه يثير استثناء من النوع EIdHTTPProtocolException. وبعد لا يرفع فئة استثناء مختلفة لكل سبب فشل ممكن، لذلك تحقق من ErrorCode الممتلكات للاستجابة الرقمية. الرجوع إلى HTTP المواصفات لمعاني رموز الاستجابة المختلفة.

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

في مثالي أعلاه، فقد فحصت 404 (غير موجود) والخروج. تأكد من أنك لا تستخدم MS إذا Get يثير استثناء لأنه سيكون له محتويات غير محددة، وربما لا تكون صورة GIF صالحة. لأي استجابة خادم آخر، أعد رفع الاستثناء حتى يمكن للمتصل التعامل معه بدلا من ذلك. ربما ترغب في تغيير ذلك. أي استثناء ليس سلللا EIdHTTPProtocolException سوف تحصل إعادة مرفوعة تلقائيا. لا تقم بالقبض على استثناءات للأخطاء التي لا تعرفها كيفية حلها.

نصائح أخرى

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

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