اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
دو دقیقه
علیرغم اینکه در Program.cs یا Startup.cs کد زیر وجود دارد، اما بازهم استثناءها در Blazor Server در قالب یک نوار زرد رنگ، پایین مرورگر نشان داده میشوند؛ حال در محیط توسعه باشد و یا در محیط تولید و پابلیش نهایی محصول!
حال کامپوننت counter را به شکل زیر ویرایش میکنیم تا استثنایی به عمد رخ دهد:
با اجرای برنامه ملاحظه خواهید کرد که به صفحهی Error.cshtml هدایت نخواهید شد! حتی با اینکه استثنایی رخ داد، خط app.UseExceptionHandler("/Error") اصلا کاری به مدیریت استثناء نداشت. حال سؤالی اینجا پیش میآید: پس چرا مایکروسافت در visual studio به تولید کدهای پیش فرض صفحه Error.cshtml و صدا زدن میان افزار فوق در یک اپلیکیشن Blazor Server میپردازد؟
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); }
برای آزمایش آن، کد فوق را به شکل زیر کامنت میکنیم تا در محیط توسعه نیز در صورتیکه استثنایی رخ داد، ما را به صفحهی Error.cshtml پیش فرض هدایت کند:
//if (env.IsDevelopment()) //{ //app.UseDeveloperExceptionPage(); //} //else //{ app.UseExceptionHandler("/Error"); //}
@page "/counter" <PageTitle>Counter</PageTitle> <h1>Counter</h1> <p role="status">Current count: @currentCount</p> <button @onclick="IncrementCount">Click me</button> @code { private int currentCount = 0; private void IncrementCount() { currentCount++; throw new Exception("This is my Exception !!"); } }
در واقع بسیاری از میان افزارهای Asp.Net Core مانند UseExceptionHandler در تمام فازهای یک اپلیکیشن Blazor Server به درستی کار نمیکنند؛ زیرا Blazor Server با SignalR و هابش کار میکند.
هنگام راهاندازی یک برنامهی Blazor Server، ابتدا چند درخواست HTTP وجود دارد که از خط لولهی Asp .Net Core عبور میکنند؛ در واقع دقیقا قبل از تشکیل هاب و عملیات websocket. در این فاز اگر استثنایی رخ دهد، آنگاه میان افزار UseExceptionHandler وارد عمل خواهد شد و صفحه را به Error.cshtml هدایت خواهد نمود و به این دلیل است که این کدها به صورت پیش فرض وجود دارند. بنابراین باید صفحهی Error.cshtml را نیز در اپلیکیشنهای تولید شدهی خود، به زبانهای موردنظر پروژهتان ترجمه کرده و پیامهای مناسبی را به کاربر نشان دهید.
باید دقت نمود که دیگر پس از این فاز نمیتوان به این میان افزار متکی بود. برای مدیریت استثناءها در فازهای بعد از این فاز، میتوان از ErrorBoundary و یا مدیریت دستی استثناءها استفاده نمود.