خطاهای پرتاب شده چیز خوبی است!این بدان معناست که زمان اجرا با موفقیت تشخیص داده شده است که چیزی در برنامه شما اشتباه رخ داده است و به شما این امکان را می دهد تا با متوقف کردن اجرای عملکرد روی پشته (stack) فعلی ، این process را بکشید (در NET / .NET Core) ،و از طریق stack trace در کنسول به اطلاع شما می رساند.
اگر شما نیاز به پرتاب دوباره خطا بعد از به دام انداختن ان را دارید،فقط از "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; }
انجام ندادن کاری با خطای گرفتار شده، همیشه امکان اصلاح یا واکنش نشان داده به خطای گفته شده را نمی دهد. پرتاب خطا خیلی خوب نیست چون اغلب اوقات می توانید در دریا از چیزهایی که روی کنسول چاپ می شود گم شوید.اگر هر بخشی از کد را در try/catch قرار دهید ، به این معنی است که فکر می کنید ممکن است خطایی در آنجا رخ دهد و بنابراین باید برنامه ای داشته باشید ،یا یک مسیر کد ایجاد کنید،برای وقتی اتفاق می افتد.
Bad:
try { FunctionThatMightThrow(); } catch (Exception ex) { // silent exception }
Good:
try { FunctionThatMightThrow(); } catch (Exception error) { NotifyUserOfError(error); // Another option ReportErrorToService(error); }
اگر شما نیاز به انجام کاری نسبت به نوع استثناء دارید ،بهتر است از بلوک چندگانه 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 }
سی شارپ 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); }