কেবলমাত্র আপনি একটি ক্যাচ ব্লক ব্যবহার করে লগ করার সিদ্ধান্ত নিয়েছিলেন বলে ব্যতিক্রমটিকে পুনরায় বাড়িয়ে তোলা (অর্থ ব্যতিক্রমটি মোটেও পরিবর্তিত হয়নি) একটি খারাপ ধারণা।
আমরা ব্যতিক্রম, ব্যতিক্রম বার্তাগুলি এবং এর পরিচালনার ব্যবহারের অন্যতম কারণ হ'ল আমরা কী ভুল বুঝতে পেরেছিলাম এবং চতুরতার সাথে লিখিত ব্যতিক্রমগুলি একটি বড় ব্যবধানে বাগটি খুঁজে পেতে দ্রুত করতে পারে।
এছাড়াও মনে রাখবেন, ব্যতিক্রমগুলি পরিচালনা করার জন্য বলার অপেক্ষা রাখে না যে তার চেয়ে বেশি সংস্থান রয়েছে if
, সুতরাং আপনার নিজের মতো লাগার কারণে আপনার সেগুলি প্রায়শই পরিচালনা করা উচিত নয়। এটি আপনার অ্যাপ্লিকেশনটির কার্যকারিতার উপর প্রভাব ফেলে।
অ্যাপ্লিকেশন স্তরটি যাতে ত্রুটিটি উপস্থিত হয়েছিল তা চিহ্নিত করার উপায় হিসাবে ব্যতিক্রমটি ব্যবহার করা তবে এটি ভাল পন্থা।
নিম্নলিখিত আধা ছদ্ম কোডটি বিবেচনা করুন:
interface ICache<T, U>
{
T GetValueByKey(U key); // may throw an CacheException
}
class FileCache<T, U> : ICache<T, U>
{
T GetValueByKey(U key)
{
throw new CacheException("Could not retrieve object from FileCache::getvalueByKey. The File could not be opened. Key: " + key);
}
}
class RedisCache<T, U> : ICache<T, U>
{
T GetValueByKey(U key)
{
throw new CacheException("Could not retrieve object from RedisCache::getvalueByKey. Failed connecting to Redis server. Redis server timed out. Key: " + key);
}
}
class CacheableInt
{
ICache<int, int> cache;
ILogger logger;
public CacheableInt(ICache<int, int> cache, ILogger logger)
{
this.cache = cache;
this.logger = logger;
}
public int GetNumber(int key) // may throw service exception
{
int result;
try {
result = this.cache.GetValueByKey(key);
} catch (Exception e) {
this.logger.Error(e);
throw new ServiceException("CacheableInt::GetNumber failed, because the cache layer could not respond to request. Key: " + key);
}
return result;
}
}
class CacheableIntService
{
CacheableInt cacheableInt;
ILogger logger;
CacheableInt(CacheableInt cacheableInt, ILogger logger)
{
this.cacheableInt = cacheableInt;
this.logger = logger;
}
int GetNumberAndReturnCode(int key)
{
int number;
try {
number = this.cacheableInt.GetNumber(key);
} catch (Exception e) {
this.logger.Error(e);
return 500; // error code
}
return 200; // ok code
}
}
আসুন ধরে নেওয়া যাক যে কেউ ত্রুটি নির্দেশ GetNumberAndReturnCode
করে 500
কোডটি কল করেছে এবং পুনরুদ্ধার করেছে । তিনি সমর্থনটি কল করতেন, যিনি লগ ফাইলটি খুলবেন এবং এটি দেখুন:
ERROR: 12:23:27 - Could not retrieve object from RedisCache::getvalueByKey. Failed connecting to Redis server. Redis server timed out. Key: 28
ERROR: 12:23:27 - CacheableInt::GetNumber failed, because the cache layer could not respond to request. Key: 28
তখন বিকাশকারী তাৎক্ষণিকভাবে জানতে পারে যে সফ্টওয়্যারটির কোন স্তর প্রক্রিয়াটি বাতিল করতে পেরেছিল এবং সমস্যাটি সনাক্ত করার একটি সহজ উপায় রয়েছে। এই ক্ষেত্রে এটি সমালোচনাযোগ্য, কারণ রেডিস সময় নির্ধারণের ফলে কখনই সুখ হয় না।
সম্ভবত অন্য ব্যবহারকারী একই পদ্ধতি কল করবে, কোডটিও গ্রহণ করবে 500
, কিন্তু লগতে নিম্নলিখিতটি দেখানো হবে:
INFO: 11:11:11- Could not retrieve object from RedisCache::getvalueByKey. Value does not exist for the key 28.
INFO: 11:11:11- CacheableInt::GetNumber failed, because the cache layer could not find any data for the key 28.
এই ক্ষেত্রে সমর্থনটি সহজেই ব্যবহারকারীকে প্রতিক্রিয়া জানাতে পারে যে অনুরোধটি অবৈধ ছিল কারণ তিনি অস্তিত্বহীন আইডির জন্য একটি মান অনুরোধ করছেন।
সারসংক্ষেপ
আপনি যদি ব্যতিক্রমগুলি পরিচালনা করছেন তবে এগুলি সঠিক উপায়ে পরিচালনা করতে ভুলবেন না। এছাড়াও আপনার ব্যতিক্রমগুলি আপনার আর্কিটেকচার স্তরগুলি অনুসরণ করে প্রথমে সঠিক তথ্য / বার্তা অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করুন, যাতে বার্তাগুলি আপনাকে এমন একটি সমস্যা চিহ্নিত করতে সহায়তা করবে যা ঘটতে পারে।