تحميل الصورة من عنوان URL - كيفية التقاط الاستثناء إذا كانت الصورة ليست موجودة
-
16-09-2019 - |
سؤال
مشكلتي تتعلق سؤال آخر لقد طلبت عن تحميل صورة من عنوان 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
سوف تحصل إعادة مرفوعة تلقائيا. لا تقم بالقبض على استثناءات للأخطاء التي لا تعرفها كيفية حلها.
نصائح أخرى
كل محاولة لديه قبض على
إنه هناك المكان الذي يجب أن تتعامل مع استثناءاتك
ربما خلق صورة فارغة مع بعض النص على ذلك الصورة غير متاحة