مدیریت خطا در Clean Code(قسمت 9)

مفهوم پایه مدیریت خطا-Basic concept of error handlingعدم استفاده از 'throw ex' در بلوک کچ-Don't use 'throw ex' in catch blockعدم نادیده گرفتن خطاهای گرفتار شده-Don't ignore caught errorsاستفاده از چند بلوک catch بجای استفاده از شرط ها-Use multiple catch block instead of if conditions.هنگام رخ دادن استثنا stack trace را حفظ کنید-Keep exception stack trace when rethrowing exceptionsمفهوم پایه مدیریت خطا Basic concept of error handlingخطاهای پرتاب شده چیز خوبی است!این بدان معناست که زمان اجرا با موفقیت تشخیص داده شده است که چیزی در برنامه شما اشتباه رخ داده است و به شما این امکان را می دهد تا با متوقف کردن اجرای عملکرد روی پشته (stack) فعلی ، این process را بکشید (در NET / .NET Core) ،و از طریق stack trace در کنسول به اطلاع شما می رساند.عدم استفاده از 'throw ex' در بلوک کچ Don't use 'throw ex' in catch blockاگر شما نیاز به پرتاب دوباره خطا بعد از به دام انداختن ان را دارید،فقط از "throw" استفاده کنید ، با استفاده از این ، شما stack trace ذخیره می کنید.اما در گزینه بد زیر ، stack trace (رد پشته) را از دست خواهید داد.Bad:try { // Do something.. } catch (Exception ex) { // Any action something like roll-back or logging etc. throw ex; }Good:try { // Do something.. } catch (Exception ex) { // Any action something like roll-back or logging etc. throw; }عدم نادیده گرفتن خطاهای گرفتار شده Don't ignore caught errorsانجام ندادن کاری با خطای گرفتار شده، همیشه امکان اصلاح یا واکنش نشان داده به خطای گفته شده را نمی دهد. پرتاب خطا خیلی خوب نیست چون اغلب اوقات می توانید در دریا از چیزهایی که روی کنسول چاپ می شود گم شوید.اگر هر بخشی از کد را در try/catch قرار دهید ، به این معنی است که فکر می کنید ممکن است خطایی در آنجا رخ دهد و بنابراین باید برنامه ای داشته باشید ،یا یک مسیر کد ایجاد کنید،برای وقتی اتفاق می افتد.Bad:try { FunctionThatMightThrow(); } catch (Exception ex) { // silent exception }Good:try { FunctionThatMightThrow(); } catch (Exception error) { NotifyUserOfError(error); // Another option ReportErrorToService(error); }استفاده از چند بلوک catch بجای استفاده از شرط ها Use multiple catch block instead of if conditions.اگر شما نیاز به انجام کاری نسبت به نوع استثناء دارید ،بهتر است از بلوک چندگانه catch برای مدیریت کردن استثنا استفاده کنید.Bad:try { // Do something.. } catch (Exception ex) { if (ex is TaskCanceledException) { // Take action for TaskCanceledException } else if (ex is TaskSchedulerException) { // Take action for TaskSchedulerException } }Good:try { // Do something.. } catch (TaskCanceledException ex) { // Take action for TaskCanceledException } catch (TaskSchedulerException ex) { // Take action for TaskSchedulerException }هنگام رخ دادن استثنا stack trace را حفظ کنید Keep exception stack trace when rethrowing exceptionsسی شارپ C# اجازه می دهد تا استثناء در یک catch block با استفاده از کلمه کلیدی throw دوباره مورد استفاده قرار گیرد. یک کار بد این است که یک استثناء گرفتار شده را با استفاده از throw e; پرتاپ کنید.این عبارت ردیابی پشته (stack trace) را reset می کند.بجای آن از throw; استفاده کنید.این باعث می شود ردیابی پشته حفظ شود و بینشی عمیق تر درباره این استثنا ارائه دهد.گزینه دیگر استفاده از یک استثناء سفارشی است.به سادگی نمونه سازی یک استثناء جدید و پرتاب new CustomException("some info", e); خاصیت استثنایی درونی خود را به استثناء گرفتار شده تبدیل کنید.اضافه کردن اطلاعات به استثناء یک عمل خوب است زیرا به اشکال زدایی کمک می کند.با این حال،اگر هدف این است که یک استثنا را log کنید ، از throw; استفاده کنید. برای انتقال buck به صدا زننده.Bad:try { FunctionThatMightThrow(); } catch (Exception ex) { logger.LogInfo(ex); throw ex; }Good:try { FunctionThatMightThrow(); } catch (Exception error) { logger.LogInfo(error); throw; }Good:try { FunctionThatMightThrow(); } catch (Exception error) { logger.LogInfo(error); throw new CustomException(error); }منبع این بخش