مدیریت استثناء در نخ جدید
سلام
دوستان ، در async await (و کلا در زمانی که درون نخ جدیدی هستیم) ، مدیریت استثناء ها چجوری هه؟
مقاله زیر را یه نگاه بسیار گذرا کردم و فرضا کدی شبیه اونچه نوشته بود نوشتم اما خطا ، مدیریت نمیشه :
Exception handling (Task Parallel Library) | Microsoft Learn
C# - What is the best way to catch exception in Task? - Stack Overflow
void ExceptionHandler(Task task)
{
MessageBox.Show(task.Exception.Message);
}
private async void MethodAsync()
{
Task fibonacciTask = Task.Factory.StartNew(() => { throw new Exception("Test"); });
//await fibonacciTask.ContinueWith(new Action<Task>(this.ExceptionHandler),
// TaskContinuationOptions.OnlyOnFaulted);
try
{
await fibonacciTask;
}
catch (AggregateException e)
{
MessageBox.Show(e.Message);
}
}
void ExceptionHandler(Task task)
{
MessageBox.Show(task.Exception.Message);
}
private async void MethodAsync()
{
Task fibonacciTask = new Task(() => { throw new Exception("Test"); });
fibonacciTask.ContinueWith(new Action<Task>(this.ExceptionHandler),
TaskContinuationOptions.OnlyOnFaulted);
try
{
fibonacciTask.Start();
await fibonacciTask;
}
catch (AggregateException e)
{
}
}
در کد دوم هم که میگه با پارامتر TaskContinuationOptions.OnlyOnRanToCompletion ئه متد ContinueWith میتونیم مدیریت کنیم ، باز هم فرقی نکرد .
در کد بالا ، بجای await fibonacciTask ، از متد Await هم طبق کد لینک اول گذاشتم ، باز هم فرقی نکرد .
من با .NetFramework 4.6.2 کار میکنم .
الان اونچه در اون لینک ها گفتن ، کار میکنه؟ یا برای من یا برای نسخه ی دات نت فریم وورک هست؟
تشکر
نقل قول: مدیریت استثناء در نخ جدید
هر exception ای لزوما AggregateException نیست.
در کد شما اصلاح کنید به
catch (Exception e)
نقل قول: مدیریت استثناء در نخ جدید
نقل قول:
نوشته شده توسط
Mahmoud.Afrad
هر exception ای لزوما AggregateException نیست.
در کد شما اصلاح کنید به
catch (Exception e)
سلام
بله حواسم نبود .
اما فرقی نداره . کلا مدیریت نمیشه .
تشکر
نقل قول: مدیریت استثناء در نخ جدید
سلامی مجدد
خیلی ممنون
اگه از اون متدی که async await توش بکار میره ، از نوع Task باشن ، حتی بدون try catch هم فقط زمانی که بدون استفاده از visual studio (یا فقط با استفاده از گزینه ی start without debugging) ، پروژه را اجرا میکنیم ، حتی در این صورتی که exception را پرتاب کردیم هم هیچ خطایی نمیده .
اما اگه خروجی اون متدها را از نوع void بگیریم ، exception پرتاب میشه .
اما منظورم هیچ کدوم شون زمان اجرای برنامه توسط visual studio نبودن (یا فقط با استفاده از گزینه ی start without debugging) .
private async Task MethodAsync()
{
Task fibonacciTask = Task.Factory.StartNew(() => { throw new Exception("Test"); });
await fibonacciTask;
}
============
همچنین اینکه همونطور که گفته بودن در همون لینک ، همه ی اونها ، برای زمانی که برنامه را با اون حالت اجرا میکنیم (یا بدون دیباگ) ، درست هست .
یعنی در اون حالت اجرا (زمان اجرا بدون استفاده از ویژال استودیو یا با حالت بدون دیباگ اش) ، وقتی قسمتِ await را در try catch بذاریم ، exception هایی که در نخ جدید (که همون در Task های اجرا شده هست) پرتاب میکنیم ، هندل و مدیریت میشن .
البته نکته هم که باید یادمون باشه اینه که خروجی این متدهایی که کلمه ی کلیدی async await توشون بکار میبریم هم را تا جای ممکن (معمولا بجز رویدادها) ، از نوع Task یا کلا نوع جنریکش بگیریم .
private async Task MethodAsync()
{
Task fibonacciTask = Task.Factory.StartNew(() => { throw new Exception("Test"); });
try
{
await fibonacciTask;
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
تشکر
نقل قول: مدیریت استثناء در نخ جدید