অ্যাডমিন SDK ত্রুটি হ্যান্ডলিং

অ্যাডমিন SDK ত্রুটি দুটি বিভাগে বিভক্ত:

  1. প্রোগ্রামিং এরর: এগুলি ব্যবহারকারীর অ্যাপ্লিকেশনে প্রোগ্রামিং এবং কনফিগারেশন ত্রুটি। এগুলি বেশিরভাগই ঘটে SDK-এর ভুল ব্যবহারের কারণে (যেমন কোনও পদ্ধতিতে null পাস করা যা null মান গ্রহণ করে না), এবং Firebase প্রকল্প বা SDK স্তরে অন্যান্য কনফিগারেশন ত্রুটি (প্রমাণপত্র অনুপস্থিত, ভুল প্রজেক্ট আইডি স্ট্রিং, এবং তাই চালু).
  2. API ত্রুটি: এর মধ্যে রয়েছে বিভিন্ন পুনরুদ্ধারযোগ্য ত্রুটি যা SDK বাস্তবায়নের মধ্যে ঘটে, Firebase ব্যাকএন্ড পরিষেবাগুলিতে উদ্ভূত সমস্ত ত্রুটি এবং RPC কল করার সময় ঘটতে পারে এমন অন্যান্য ক্ষণস্থায়ী ত্রুটি (যেমন টাইমআউট)।

প্রশাসক SDK একটি ত্রুটি ছুঁড়ে প্রোগ্রামিং ত্রুটির সংকেত দেয় যা প্রশ্নে থাকা প্ল্যাটফর্মের স্থানীয়।

  • Java: IllegalArgumentException , NullPointerException বা অনুরূপ বিল্ট-ইন রানটাইম ত্রুটির উদাহরণ ছুড়ে দেয়।
  • Python: ValueError , TypeError বা অন্যান্য অন্তর্নির্মিত ত্রুটির প্রকারের উদাহরণ উত্থাপন করে।
  • যান: একটি সাধারণ ত্রুটি প্রদান করে।
  • .NET: ArgumentException , ArgumentNullException বা অনুরূপ বিল্ট-ইন ত্রুটি টাইপের উদাহরণ নিক্ষেপ করে।

বেশিরভাগ পরিস্থিতিতে আপনার স্পষ্টভাবে প্রোগ্রামিং ত্রুটিগুলি পরিচালনা করা উচিত নয়। পরিবর্তে, প্রোগ্রামিং ত্রুটিগুলি সম্পূর্ণভাবে এড়াতে আপনার কোড এবং কনফিগারেশন ঠিক করা উচিত। নিম্নলিখিত জাভা স্নিপেট বিবেচনা করুন:

String uid = getUserInput();

UserRecord user = FirebaseAuth.getInstance().getUser(uid);

যদি getUserInput() পদ্ধতিটি null বা খালি স্ট্রিং প্রদান করে, FirebaseAuth.getUser() API একটি IllegalArgumentException নিক্ষেপ করে। এটি স্পষ্টভাবে পরিচালনা করার পরিবর্তে, getUserInput() পদ্ধতিটি কখনই একটি অবৈধ UID স্ট্রিং ফেরত না দেয় তা নিশ্চিত করে আপনি সমস্যাটি কমাতে পারেন। যদি এটি সম্ভব না হয়, নিম্নরূপ আপনার নিজের কোডে প্রয়োজনীয় আর্গুমেন্ট চেকিং বাস্তবায়ন করুন:

String uid = getUserInput();
if (Strings.isNullOrEmpty(uid)) {
    log.warn("UID must not be null or empty");
    return;
}

UserRecord user = FirebaseAuth.getInstance().getUser(uid);

একটি নীতি হিসাবে, প্রোগ্রামিং ত্রুটির উপর পুনরায় চেষ্টা করবেন না. প্রোগ্রামিং ত্রুটির জন্য ব্যর্থ-দ্রুত শব্দার্থবিদ্যার জন্য অনুমতি দেওয়া প্রায়শই সর্বোত্তম পদক্ষেপ কারণ এটি বিকাশের সময় প্রোগ্রামিং বাগ এবং কনফিগারেশন ত্রুটিগুলিকে প্রকাশ করে, যেখানে সেগুলি দ্রুত ঠিক করা যেতে পারে। এই প্রেক্ষাপটে ব্যর্থ-দ্রুত হওয়ার অর্থ হতে পারে আপনার অ্যাপ্লিকেশনে ত্রুটিগুলিকে একটি বিশ্বব্যাপী ত্রুটি হ্যান্ডলারের কাছে প্রচার করতে দেওয়া, অথবা কেবলমাত্র নিরীক্ষার উদ্দেশ্যে সেগুলিকে লগ করা এবং বর্তমান কার্যকরী প্রবাহের সমাপ্তি (অ্যাপ্লিকেশানটি ক্র্যাশ হওয়া উচিত নয়)। সাধারণভাবে, আপনার প্রোগ্রামিং ভাষা এবং অ্যাপ্লিকেশন ফ্রেমওয়ার্কের সর্বোত্তম অনুশীলনের ত্রুটি পরিচালনা করুন। এই শ্রেণীর ত্রুটিগুলি সঠিকভাবে মোকাবেলা করার জন্য এটি একাই যথেষ্ট।

সাধারণত, আপনার ত্রুটি পরিচালনার প্রচেষ্টার সিংহভাগই API ত্রুটিগুলি পরিচালনার উপর ফোকাস করবে৷ এই ত্রুটিগুলির মধ্যে কিছু পুনরুদ্ধারযোগ্য, যেমন ত্রুটিগুলি যা একটি অস্থায়ীভাবে অনুপলব্ধ পরিষেবার ফলে, এবং কিছু এমনকি সাধারণ প্রোগ্রাম নির্বাহের প্রবাহের সময় প্রত্যাশিত, যেমন অবৈধ বা মেয়াদোত্তীর্ণ আইডি টোকেন সনাক্ত করা। এই নির্দেশিকাটির বাকি অংশে প্রশাসক SDK কীভাবে এই ধরনের API ত্রুটিগুলিকে উপস্থাপন করে এবং সেগুলি পরিচালনা করার জন্য উপলব্ধ বিভিন্ন বিকল্পের রূপরেখা দেয়৷

একটি API ত্রুটির গঠন

একটি API ত্রুটি নিম্নলিখিত উপাদানগুলি নিয়ে গঠিত:

  1. ভুল সংকেত
  2. ভুল বার্তা
  3. পরিষেবা ত্রুটি কোড (ঐচ্ছিক)
  4. HTTP প্রতিক্রিয়া (ঐচ্ছিক)

প্রতিটি API ত্রুটি একটি ত্রুটি কোড এবং একটি ত্রুটি বার্তা ধারণ করা নিশ্চিত করা হয়. কিছু এপিআই ত্রুটিতে একটি পরিষেবা ত্রুটি কোডও থাকে যা এপিআইয়ের জন্য নির্দিষ্ট যা ত্রুটি তৈরি করেছে। উদাহরণস্বরূপ Firebase Auth API দ্বারা উত্পন্ন কিছু ত্রুটির মধ্যে একটি পরিষেবা ত্রুটি কোড থাকে যা Firebase Auth-এর জন্য নির্দিষ্ট। যদি ত্রুটিটি একটি ব্যাকএন্ড পরিষেবা থেকে একটি HTTP ত্রুটি প্রতিক্রিয়ার ফলাফল হয়ে থাকে, তবে API ত্রুটিতে সংশ্লিষ্ট HTTP প্রতিক্রিয়াও থাকে৷ এটি মূল প্রতিক্রিয়ার সঠিক শিরোনাম এবং বিষয়বস্তু পরিদর্শন করতে ব্যবহার করা যেতে পারে, যা ডিবাগিং, লগিং বা আরও পরিশীলিত ত্রুটি পরিচালনা যুক্তি প্রয়োগ করার জন্য দরকারী।

Node.js ব্যতীত সমস্ত অ্যাডমিন SDK বাস্তবায়ন APIগুলি প্রদান করে যা API ত্রুটিগুলির উপরোক্ত উপাদানগুলি অ্যাক্সেস করতে সক্ষম করে৷

ভাষা অনুসারে ত্রুটির ধরন এবং API

জাভা

জাভাতে সমস্ত API ত্রুটি FirebaseException ক্লাস প্রসারিত করে। আপনি এই বেস ক্লাস থেকে ত্রুটি কোড, ত্রুটি বার্তা এবং ঐচ্ছিক HTTP প্রতিক্রিয়া অ্যাক্সেস করতে পারেন।

public class FirebaseException extends Exception {
    @NonNull
    public ErrorCode getErrorCode() {
        // ...
    }

    @NonNull
    public String getMessage() {
        // ...
    }

    @Nullable
    public IncomingHttpResponse getHttpResponse() {
        // ...
    }
}

যে APIগুলি পরিষেবা ত্রুটি কোডগুলি প্রকাশ করে সেগুলি FirebaseException এর API-নির্দিষ্ট সাবক্লাস প্রদান করে। উদাহরণ স্বরূপ FirebaseAuth API-এর সমস্ত পাবলিক পদ্ধতিকে FirebaseAuthException এর উদাহরণ দেওয়ার জন্য ঘোষণা করা হয়েছে। আপনি এই প্রাপ্ত ক্লাস থেকে পরিষেবা ত্রুটি কোড অ্যাক্সেস করতে পারেন।

public class FirebaseAuthException extends FirebaseException {
    @Nullable
    public AuthErrorCode getAuthErrorCode() {
        // ...
    }
}

পাইথন

পাইথনে সমস্ত API ত্রুটি ব্যতিক্রমগুলিকে প্রসারিত করে exceptions.FirebaseError ক্লাস। আপনি এই বেস ক্লাস থেকে ত্রুটি কোড, ত্রুটি বার্তা এবং ঐচ্ছিক HTTP প্রতিক্রিয়া অ্যাক্সেস করতে পারেন।

class FirebaseError(Exception):
    @property
    def code(self):
          # ...

    @property
    def message(self):
          # ...

    @property
    def http_response(self):
          # ...

তাছাড়া, পাইথন অ্যাডমিন SDK প্রতিটি ত্রুটি কোডের জন্য পৃথক প্রাপ্ত ক্লাস অফার করে। আমরা তাদের প্ল্যাটফর্ম এরর ক্লাস হিসাবে উল্লেখ করি।

class InvalidArgumentError(FirebaseError):
    # ...

class NotFoundError(FirebaseError):
    # ...

আপনি হয় আপনার কোডে FirebaseError ধরতে পারেন এবং এর code চেক করতে পারেন, অথবা একটি প্ল্যাটফর্ম এরর ক্লাসের বিরুদ্ধে একটি isinstance() চেক করতে পারেন। অথবা আপনি সরাসরি নির্দিষ্ট প্ল্যাটফর্ম ত্রুটি ধরন ধরতে কোড লিখতে পারেন। পরবর্তী পদ্ধতির ফলে আরও পঠনযোগ্য ত্রুটি হ্যান্ডলিং কোড হওয়ার সম্ভাবনা রয়েছে।

API যেগুলি পরিষেবা ত্রুটি কোডগুলি প্রকাশ করে প্ল্যাটফর্ম ত্রুটি ক্লাসগুলির API-নির্দিষ্ট সাবক্লাসগুলি প্রদান করে৷ উদাহরণস্বরূপ, auth মডিউলের সমস্ত পাবলিক পদ্ধতি API-নির্দিষ্ট ত্রুটির ধরন যেমন auth.UserNotFoundError এবং auth.ExpiredIdTokenError নিক্ষেপ করতে পারে।

class UserNotFoundError(exceptions.NotFoundError):
    # …

class ExpiredIdTokenError(exceptions.InvalidArgumentError):
    # ...

যাওয়া

Go Admin SDK একটি errorutils প্যাকেজ প্রদান করে যাতে একাধিক ফাংশন রয়েছে যা ত্রুটি কোডের জন্য পরীক্ষা করার অনুমতি দেয়।

package errorutils

func IsInvalidArgument(err error) bool {
    // ...
}

func IsNotFound(err error) bool {
    // ...
}

ত্রুটির বার্তাটি হল একটি ত্রুটির Error() ফাংশন দ্বারা প্রত্যাবর্তিত স্ট্রিং। ঐচ্ছিক HTTP প্রতিক্রিয়া errorutils.HTTPResponse() ফাংশন কল করে অ্যাক্সেস করা যেতে পারে, যা একটি *http.Response প্রদান করে।

errorutils প্যাকেজে ত্রুটি পরীক্ষা করার ফাংশনে nil বা অন্য কোনো ত্রুটি মান পাস করা নিরাপদ। যদি ইনপুট আর্গুমেন্টে প্রকৃতপক্ষে প্রশ্নে ত্রুটি কোড থাকে তবে তারা true ফেরত দেয় এবং অন্য সবকিছুর জন্য false ফেরত দেয়। HTTPResponse() ফাংশনের অনুরূপ আচরণ আছে, এটি false পরিবর্তে nil প্রদান করে।

যে APIগুলি পরিষেবা ত্রুটি কোডগুলি প্রকাশ করে সেগুলি সংশ্লিষ্ট প্যাকেজে API-নির্দিষ্ট ত্রুটি পরীক্ষা করার ফাংশন প্রদান করে। উদাহরণস্বরূপ, auth প্যাকেজটি IsUserNotFound() এবং IsExpiredIDTokenError() ফাংশন প্রদান করে।

.নেট

.NET-এ সমস্ত API ত্রুটি FirebaseException ক্লাসকে প্রসারিত করে। আপনি এই বেস ক্লাস থেকে প্ল্যাটফর্ম ত্রুটি কোড, ত্রুটি বার্তা এবং ঐচ্ছিক HTTP প্রতিক্রিয়া অ্যাক্সেস করতে পারেন।

public class FirebaseException : Exception {

    public ErrorCode ErrorCode { get; }

    public String Message { get; }

    public HttpResponseMessage HttpResponse { get; }
}

যে APIগুলি পরিষেবা ত্রুটি কোডগুলি প্রকাশ করে সেগুলি FirebaseException এর API-নির্দিষ্ট সাবক্লাস প্রদান করে। উদাহরণস্বরূপ, FirebaseAuth API-এর সমস্ত পাবলিক পদ্ধতিকে FirebaseAuthException এর উদাহরণ দেওয়ার জন্য ঘোষণা করা হয়েছে। আপনি এই প্রাপ্ত ক্লাস থেকে পরিষেবা ত্রুটি কোড অ্যাক্সেস করতে পারেন।

public class FirebaseAuthException : FirebaseException {

    public AuthErrorCode AuthErrorCode { get; }
}

প্ল্যাটফর্ম ত্রুটি কোড

সমস্ত Firebase এবং Google ক্লাউড প্ল্যাটফর্ম পরিষেবাগুলিতে ত্রুটি কোডগুলি সাধারণ৷ নিম্নলিখিত সারণী সমস্ত সম্ভাব্য প্ল্যাটফর্ম ত্রুটি কোড রূপরেখা. এটি একটি স্থিতিশীল তালিকা, এবং দীর্ঘ সময়ের জন্য অপরিবর্তিত থাকবে বলে আশা করা হচ্ছে।

INVALID_ARGUMENT ক্লায়েন্ট একটি অবৈধ যুক্তি নির্দিষ্ট করেছে৷
FAILED_PRECONDITION অনুরোধটি বর্তমান সিস্টেমের অবস্থায় চালানো যাবে না, যেমন একটি অ-খালি ডিরেক্টরি মুছে ফেলা।
সীমার বাইরে ক্লায়েন্ট একটি অবৈধ পরিসীমা নির্দিষ্ট করেছে৷
অননুমোদিত অনুপস্থিত, অবৈধ বা মেয়াদোত্তীর্ণ OAuth টোকেনের কারণে অনুরোধটি প্রমাণীকরণ করা হয়নি।
PERMISSION_DENIED ক্লায়েন্টের পর্যাপ্ত অনুমতি নেই। এটি ঘটতে পারে কারণ OAuth টোকেনের সঠিক স্কোপ নেই, ক্লায়েন্টের অনুমতি নেই বা ক্লায়েন্ট প্রকল্পের জন্য API সক্ষম করা হয়নি।
NOT_FOUND নির্দিষ্ট রিসোর্স পাওয়া যায় নি, বা হোয়াইটলিস্টিংয়ের মতো অপ্রকাশিত কারণে অনুরোধটি প্রত্যাখ্যান করা হয়েছে।
দ্বন্দ্ব সঙ্গতি দ্বন্দ্ব, যেমন পড়া-সংশোধন-লেখার দ্বন্দ্ব। শুধুমাত্র কয়েকটি উত্তরাধিকার পরিষেবা দ্বারা ব্যবহৃত হয়। বেশিরভাগ পরিষেবাগুলি এর পরিবর্তে ABORTED বা ALREADY_EXISTS ব্যবহার করে৷ আপনার কোডে কোনটি পরিচালনা করতে হবে তা দেখতে পরিষেবা-নির্দিষ্ট ডকুমেন্টেশন পড়ুন।
বর্জন করা হয়েছে সঙ্গতি দ্বন্দ্ব, যেমন পড়া-সংশোধন-লেখার দ্বন্দ্ব।
আগে থেকেই আছে একটি ক্লায়েন্ট যে সংস্থান তৈরি করার চেষ্টা করেছে তা ইতিমধ্যেই বিদ্যমান।
RESOURCE_EXHAUSTED হয় রিসোর্স কোটার বাইরে বা হার সীমিত।
বাতিল করা হয়েছে ক্লায়েন্ট দ্বারা অনুরোধ বাতিল করা হয়েছে.
ডেটা_লোস অপুনরুদ্ধারযোগ্য ডেটা ক্ষতি বা ডেটা দুর্নীতি। ক্লায়েন্ট ব্যবহারকারীকে ত্রুটি রিপোর্ট করা উচিত.
অজানা অজানা সার্ভার ত্রুটি. সাধারণত একটি সার্ভার বাগ।

এই ত্রুটি কোডটি স্থানীয় প্রতিক্রিয়া পার্সিং (আনমার্শাল) ত্রুটি এবং অন্যান্য নিম্ন-স্তরের I/O ত্রুটিগুলির একটি বিস্তৃত পরিসরের জন্যও বরাদ্দ করা হয়েছে যা সহজে নির্ণয় করা যায় না।

অভ্যন্তরীণ অভ্যন্তরীণ সার্ভার ত্রুটি. সাধারণত একটি সার্ভার বাগ।
অনুপলব্ধ সেবা প্রদান করা যাচ্ছে না. সাধারণত সার্ভার সাময়িকভাবে ডাউন থাকে।

এই ত্রুটি কোডটি স্থানীয় নেটওয়ার্ক ত্রুটিগুলির জন্যও বরাদ্দ করা হয়েছে (সংযোগ প্রত্যাখ্যান করা হয়েছে, হোস্ট করার জন্য কোনও রুট নেই)।

DEADLINE_EXCEEDED অনুরোধের সময়সীমা অতিক্রম করেছে৷ এটি তখনই ঘটবে যখন কলকারী একটি নির্দিষ্ট সময়সীমা সেট করে যা লক্ষ্য API এর ডিফল্ট সময়সীমার চেয়ে ছোট (অর্থাৎ অনুরোধ করা সময়সীমা সার্ভারের জন্য অনুরোধটি প্রক্রিয়া করার জন্য যথেষ্ট নয়), এবং অনুরোধটি সময়সীমার মধ্যে শেষ না হয়৷

এই ত্রুটি কোডটি স্থানীয় সংযোগ এবং পড়ার সময়সীমার জন্যও বরাদ্দ করা হয়েছে।

বেশীরভাগ API শুধুমাত্র উপরের ত্রুটি কোডগুলির একটি উপসেট হতে পারে। যাই হোক না কেন, আপনার ত্রুটি হ্যান্ডলারগুলি প্রয়োগ করার সময় আপনি এই সমস্ত ত্রুটি কোডগুলি স্পষ্টভাবে পরিচালনা করবেন বলে আশা করা হয় না। বেশিরভাগ অ্যাপ্লিকেশনগুলি শুধুমাত্র 1-2টি নির্দিষ্ট ত্রুটি কোডগুলিতে আগ্রহী হবে এবং অন্য সমস্ত কিছুকে জেনেরিক, পুনরুদ্ধারযোগ্য ব্যর্থতা হিসাবে বিবেচনা করবে।

পরিষেবা-নির্দিষ্ট ত্রুটি কোড

ফায়ারবেস প্রমাণ

CERTIFICATE_FETCH_FAILED একটি JWT (আইডি টোকেন বা সেশন কুকি) যাচাই করার জন্য প্রয়োজনীয় সর্বজনীন কী শংসাপত্র আনতে ব্যর্থ হয়েছে৷
ই - মেইল ​​টি আগে থেকেই আছে প্রদত্ত ইমেলের সাথে একজন ব্যবহারকারী ইতিমধ্যেই বিদ্যমান।
EXPIRED_ID_TOKEN আইডি টোকেন verifyIdToken() জন্য নির্দিষ্ট করা আইডি টোকেনের মেয়াদ শেষ হয়ে গেছে।
EXPIRED_SESSION_COOKIE verifySessionCookie() জন্য নির্দিষ্ট করা সেশন কুকির মেয়াদ শেষ হয়ে গেছে।
INVALID_DYNAMIC_LINK_DOMAIN প্রদত্ত ডায়নামিক লিঙ্ক ডোমেন বর্তমান প্রকল্পের জন্য কনফিগার বা অনুমোদিত নয়। ইমেল অ্যাকশন লিঙ্ক API এর সাথে সম্পর্কিত।
INVALID_ID_TOKEN আইডি টোকেন verifyIdToken() জন্য নির্দিষ্ট করা আইডি টোকেনটি অবৈধ।
INVALID_SESSION_COOKIE verifySessionCookie() জন্য নির্দিষ্ট করা সেশন কুকি অবৈধ৷
PHONE_NUMBER_ALREADY_EXISTS প্রদত্ত ফোন নম্বর সহ একজন ব্যবহারকারী ইতিমধ্যেই বিদ্যমান৷
REVOKED_ID_TOKEN আইডি টোকেন verifyIdToken() জন্য নির্দিষ্ট করা আইডি টোকেন প্রত্যাহার করা হয়েছে।
REVOKED_SESSION_COOKIE verifySessionCookie() জন্য নির্দিষ্ট করা সেশন কুকির মেয়াদ শেষ হয়ে গেছে।
UNAUTHORIZED_CONTINUE_URL অবিরত URL-এর ডোমেন সাদা তালিকাভুক্ত নয়। ইমেল অ্যাকশন লিঙ্ক API এর সাথে সম্পর্কিত।
ব্যবহারকারী খুঁজে পাওয়া যায় না প্রদত্ত শনাক্তকারীর জন্য কোনো ব্যবহারকারীর রেকর্ড পাওয়া যায়নি।

ফায়ারবেস ক্লাউড মেসেজিং

THIRD_PARTY_AUTH_ERROR APNs সার্টিফিকেট বা ওয়েব পুশ auth API কী অবৈধ বা অনুপস্থিত ছিল৷
INVALID_ARGUMENT অনুরোধে উল্লেখ করা এক বা একাধিক আর্গুমেন্ট অবৈধ ছিল৷
অভ্যন্তরীণ অভ্যন্তরীণ সার্ভার ত্রুটি.
কোটা অতিক্রম করেছে বার্তা টার্গেটের জন্য পাঠানোর সীমা অতিক্রম করেছে৷
SENDER_ID_MISMATCH নিবন্ধন টোকেনের জন্য প্রমাণীকৃত প্রেরক আইডি প্রেরকের আইডি থেকে আলাদা। এর মানে সাধারণত প্রেরক এবং টার্গেট রেজিস্ট্রেশন টোকেন একই ফায়ারবেস প্রোজেক্টে নেই।
অনুপলব্ধ ক্লাউড মেসেজিং পরিষেবা সাময়িকভাবে অনুপলব্ধ৷
অনিবন্ধিত অ্যাপের উদাহরণ FCM থেকে রেজিস্টার করা হয়নি। এর মানে সাধারণত ব্যবহৃত ডিভাইস রেজিস্ট্রেশন টোকেন আর বৈধ নয় এবং একটি নতুন ব্যবহার করতে হবে।

স্বয়ংক্রিয় পুনরায় চেষ্টা

অ্যাডমিন SDK স্বয়ংক্রিয়ভাবে ব্যবহারকারীদের কাছে সেই ত্রুটিগুলি প্রকাশ করার আগে নির্দিষ্ট ত্রুটিগুলি পুনরায় চেষ্টা করে৷ সাধারণভাবে, নিম্নলিখিত ধরণের ত্রুটিগুলি স্বচ্ছভাবে পুনঃপ্রচেষ্টা করা হয়:

  • HTTP 503 (পরিষেবা অনুপলব্ধ) প্রতিক্রিয়াগুলির ফলে সমস্ত API ত্রুটি৷
  • HTTP 500 (অভ্যন্তরীণ সার্ভার ত্রুটি) প্রতিক্রিয়ার ফলে কিছু API ত্রুটি।
  • বেশিরভাগ নিম্ন-স্তরের I/O ত্রুটিগুলি (সংযোগ প্রত্যাখ্যান করা হয়েছে, সংযোগ পুনরায় সেট করা ইত্যাদি)।

SDK সূচকীয় ব্যাকঅফ সহ 5 বার পর্যন্ত (মূল প্রচেষ্টা + 4টি পুনঃপ্রয়াস) উপরের প্রতিটি ত্রুটির জন্য পুনরায় চেষ্টা করবে। আপনি চাইলে অ্যাপ্লিকেশন স্তরে আপনার নিজস্ব পুনঃপ্রচেষ্টা প্রক্রিয়া প্রয়োগ করতে পারেন, তবে এটি সাধারণত প্রয়োজন হয় না।

পুনরায় চেষ্টা করুন-পরে সমর্থন

অ্যাডমিন SDK-এর Go এবং .NET ইমপ্লিমেন্টেশন এইচটিটিপি Retry-After হেডার পরিচালনার জন্য সমর্থন সহ আসে। অর্থাৎ, যদি ব্যাকএন্ড সার্ভারের দ্বারা প্রেরিত ত্রুটির উত্তরে স্ট্যান্ডার্ড Retry-After হেডার থাকে, তাহলে নির্দিষ্ট অপেক্ষার সময়কাল খুব বেশি না হলে SDK পুনরায় চেষ্টা করার সময় সম্মান করবে। যদি Retry-After শিরোনামটি একটি দীর্ঘ অপেক্ষার সময়কাল নির্দেশ করে, তাহলে SDK পুনরায় চেষ্টাকে বাইপাস করবে এবং উপযুক্ত API ত্রুটি ফেলে দেবে।

Python Admin SDK বর্তমানে Retry-After হেডার সমর্থন করে না এবং শুধুমাত্র সাধারণ সূচকীয় ব্যাকঅফ সমর্থন করে।

API ত্রুটি হ্যান্ডলিং উদাহরণ

একটি জেনেরিক ত্রুটি হ্যান্ডলার বাস্তবায়ন

বেশিরভাগ ক্ষেত্রে আপনি যা চান তা হল একটি জেনেরিক ত্রুটি হ্যান্ডলার যা একটি API ত্রুটির কারণে প্রোগ্রাম প্রবাহের অপ্রত্যাশিত সমাপ্তি রোধ করতে বিস্তৃত ত্রুটিগুলি ধরে। এই ধরনের ত্রুটি হ্যান্ডলাররা সাধারণত শুধুমাত্র অডিটের উদ্দেশ্যে ত্রুটিগুলি লগ করে, বা সমস্ত সম্মুখীন API ত্রুটিগুলির জন্য কিছু অন্য ডিফল্ট ত্রুটি পরিচালনার রুটিন আহ্বান করে। তারা অগত্যা বিভিন্ন ত্রুটি কোড বা ত্রুটির কারণ হতে পারে যে কারণে আগ্রহী নয়.

জাভা

try {
  FirebaseToken token = FirebaseAuth.getInstance().verifyIdToken(idToken);
  performPrivilegedOperation(token.getUid());
} catch (FirebaseAuthException ex) {
  System.err.println("Failed to verify ID token: " + ex.getMessage());
}

পাইথন

try:
  token = auth.verify_id_token(idToken)
  perform_privileged_pperation(token.uid)
except exceptions.FirebaseError as ex:
  print(f'Failed to verify ID token: {ex}')

যাওয়া

token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
  log.Printf("Failed to verify ID token: %v", err)
  return
}

performPrivilegedOperation(token)

.নেট

try
{
  var token = await FirebaseAuth.DefaultInstance.VerifyIdTokenAsync(idToken);
  PerformPrivilegedOperation(token.getUid());
}
catch (FirebaseAuthException ex) 
{
  Conole.WriteLine($"Failed to verify ID token: {ex.Message}");
}

ত্রুটি কোড পরীক্ষা করা হচ্ছে

কিছু ক্ষেত্রে, আপনি সঠিক ত্রুটি কোডগুলি পরিদর্শন করতে এবং বিভিন্ন প্রসঙ্গ-সচেতন ত্রুটি পরিচালনার রুটিনগুলিকে আহ্বান করতে চান৷ নিম্নলিখিত উদাহরণে, আমাদের একটি ত্রুটি হ্যান্ডলার রয়েছে যা পরিষেবা ত্রুটি কোডের উপর ভিত্তি করে আরও নির্দিষ্ট ত্রুটি বার্তা লগ করে।

জাভা

try {
  FirebaseToken token = FirebaseAuth.getInstance().verifyIdToken(idToken);
  performPrivilegedOperation(token.getUid());
} catch (FirebaseAuthException ex) {
  if (ex.getAuthErrorCode() == AuthErrorCode.ID_TOKEN_EXPIRED) {
    System.err.println("ID token has expired");
  } else if (ex.getAuthErrorCode() == AuthErrorCode.ID_TOKEN_INVALID) {
    System.err.println("ID token is malformed or invalid");
  } else {
    System.err.println("Failed to verify ID token: " + ex.getMessage());
  }
}

পাইথন

try:
  token = auth.verify_id_token(idToken)
  perform_privileged_operation(token.uid)
except auth.ExpiredIdTokenError:
  print('ID token has expired')
except auth.InvalidIdTokenError:
  print('ID token is malformed or invalid')
except exceptions.FirebaseError as ex:
  print(f'Failed to verify ID token: {ex}')

যাওয়া

token, err := client.VerifyIDToken(ctx, idToken)
if auth.IsIDTokenExpired(err) {
  log.Print("ID token has expired")
  return
}
if auth.IsIDTokenInvalid(err) {
  log.Print("ID token is malformed or invalid")
  return
}
if err != nil {
  log.Printf("Failed to verify ID token: %v", err)
  return
}

performPrivilegedOperation(token)

.নেট

try
{
  var token = await FirebaseAuth.DefaultInstance.VerifyIdTokenAsync(idToken);
  PerformPrivilegedOperation(token.getUid());
}
catch (FirebaseAuthException ex)
{
  if (ex.AuthErrorCode == AuthErrorCode.ExpiredIdToken)
  {
    Console.WriteLine("ID token has expired");
  }
  else if (ex.AuthErrorCode == AuthErrorCode.InvalidIdToken)
  {
    Console.WriteLine("ID token is malformed or invalid");
  }
  else
  {
    Conole.WriteLine($"Failed to verify ID token: {ex.Message}");
  }
}

এখানে আরেকটি উদাহরণ রয়েছে যেখানে আমরা শীর্ষ-স্তরের এবং পরিষেবা ত্রুটি কোড উভয়ই পরীক্ষা করি:

জাভা

try {
  FirebaseMessaging.getInstance().send(createMyMessage());
} catch (FirebaseMessagingException ex){
  if (ex.getMessagingErrorCode() == MessagingErrorCode.UNREGISTERED) {
    System.err.println("App instance has been unregistered");
    removeTokenFromDatabase();
  } else if (ex.getErrorCode() == ErrorCode.Unavailable) {
    System.err.println("FCM service is temporarily unavailable");
    scheduleForRetryInAnHour();
  } else {
    System.err.println("Failed to send notification: " + ex.getMessage());
  }
}

পাইথন

try:
  messaging.send(create_my_message())
except messaging.UnregisteredError:
  print('App instance has been unregistered')
  remove_token_from_database()
except exceptions.UnavailableError:
  print('FCM service is temporarily unavailable')
  schedule_for_retry_in_an_hour()
except exceptions.FirebaseError as ex:
  print(f'Failed to send notification: {ex}')

যাওয়া

_, err := client.Send(ctx, createMyMessage())
if messaging.IsUnregistered(err) {
  log.Print("App instance has been unregistered")
  removeTokenFromDatabase()
  return
}
if errorutils.IsUnavailable(err) {
  log.Print("FCM service is temporarily unavailable")
  scheduleForRetryInAnHour()
  return
}
if err != nil {
  log.Printf("Failed to send notification: %v", err)
  return
}

.নেট

try
{
  await FirebaseMessaging.DefaultInstance.SendAsync(createMyMessage());
}
catch (FirebaseMessagingException ex)
{
  if (ex.MessagingErrorCode == MessagingErrorCode.UNREGISTERED)
  {
    Console.WriteLine("App instance has been unregistered");
    removeTokenFromDatabase();
  }
  else if (ex.ErrorCode == ErrorCode.Unavailable)
  {
    Console.WriteLine("FCM service is temporarily unavailable");
    scheduleForRetryInAnHour();
  }
  else
  {
    Console.WriteLine($"Failed to send notification: {ex.Message}");
  }
}

HTTP প্রতিক্রিয়া অ্যাক্সেস করা হচ্ছে

কিছু বিরল ক্ষেত্রে আপনি একটি ব্যাকএন্ড পরিষেবা দ্বারা প্রত্যাবর্তিত HTTP ত্রুটি প্রতিক্রিয়া পরিদর্শন করতে এবং এটিতে কিছু ত্রুটি পরিচালনার পদক্ষেপ করতে চাইতে পারেন। অ্যাডমিন SDK এই ত্রুটির প্রতিক্রিয়াগুলির শিরোনাম এবং বিষয়বস্তু উভয়ই প্রকাশ করে৷ প্রতিক্রিয়া বিষয়বস্তু সাধারণত একটি স্ট্রিং বা একটি কাঁচা বাইট ক্রম হিসাবে ফেরত দেওয়া হয়, এবং প্রয়োজনীয় যেকোনো লক্ষ্য বিন্যাসে পার্স করা যেতে পারে।

জাভা

try {
  FirebaseMessaging.getInstance().send(createMyMessage());
} catch (FirebaseMessagingException ex){
  IncomingHttpResponse response = ex.getHttpResponse();
  if (response != null) {
    System.err.println("FCM service responded with HTTP " + response.getStatusCode());

    Map<String, Object> headers = response.getHeaders();
    for (Map.Entry<String, Object> entry : headers.entrySet()) {
      System.err.println(">>> " + entry.getKey() + ": " + entry.getValue());
    }

    System.err.println(">>>");
    System.err.println(">>> " + response.getContent());
  }
}

পাইথন

try:
  messaging.send(create_my_message())
except exceptions.FirebaseError as ex:
  response = ex.http_response
  if response is not None:
    print(f'FCM service responded with HTTP {response.status_code}')

    for key, value in response.headers.items():
      print(f'>>> {key}: {value}')

    print('>>>')
    print(f'>>> {response.content}')

যাওয়া

_, err := client.Send(ctx, createMyMessage())
if resp := errorutils.HTTPResponse(err); resp != nil {
  log.Printf("FCM service responded with HTTP %d", resp.StatusCode)

  for key, value := range resp.Header {
      log.Printf(">>> %s: %v", key, value)
  }

  defer resp.Body.Close()
  b, _ := ioutil.ReadAll(resp.Body)
  log.Print(">>>")
  log.Printf(">>> %s", string(b))

  return
}

.নেট

try
{
  await FirebaseMessaging.DefaultInstance.SendAsync(createMyMessage());
}
catch (FirebaseMessagingException ex)
{
  var response = ex.HttpResponse
  if response != null
  {
    Console.WriteLine($"FCM service responded with HTTP { response.StatusCode}");

    var headers = response.Headers;
    for (var entry in response.Headers)
    {
      Console.WriteLine($">>> {entry.Key}: {entry.Value}");
    }

    var body = await response.Content.ReadAsString();
    Console.WriteLine(">>>");
    Console.WriteLine($">>> {body}");
  }
}