Код ниже является частью страницы Blazor html. Try catch сработает, если возникнет исключение NOT WITHA A <DIV>
. В противном случае произойдет сбой (страница браузера будет зависать). Я включил обе версии для ясности.
Исключение
_messageInput равно нулю
в 19-й строке снизу, это легко исправить. Мой вопрос касается других исключений, которые еще не встречались или не решались. Как я могу сделать упругую попытку, которая не приведет к сбою страницы?
Зависшая страница - худшая. Отсутствие перехвата или «выброса» исключения приведет к тому, что в браузере отобразится «Необработанная ошибка», которая вообще не помогает (на мобильном устройстве нет способа ее отладить).
Вот версия кода, которая дает сбой ( страница браузера зависает):
<div class="text-left" style="padding:5px;">
@try
{
_relativeLeft = "0";
_relativeTop = "0";
_relativeHandTop = "0";
if (_player == Pos.UnSeated) //not even seated.
{
<button class="btn btn-cmd btn-disabled" style="color:transparent">-</button><!--place holder-->
int i = 0;
for (int j = 0; j < 4; j++) //3 to 7 %4 = to iterate 3,0,1,2 to get West on the left of the screen.
{
int k = j % 4;
if (bTable.PlayIdsNew[k] == "")//show only buttons that are not assigned to players.
{
<button class="btn btn-cmd" style="color:#ff6a00;font-weight:600" @onclick='(() => ReqSeat((Pos)k))'>Seat @bTable.ChrFrmPos(k)</button>
i++;
}
}
if (i == 0)//not seated and no seat available
{
<button class="btn btn-cmd" @onclick="@(() => RecoverSeat())">Recover Seat</button>
<button class="btn btn-cmd" @onclick="@(() => Reset())">Reset</button>
}
}
else //Have Seat...
{
@if (IsConnected)
{
if (bTable.Contract != null)
{
<button class="btn btn-cmd btn-disabled">@_player @bTable.Contract</button>
}
else
{
<button class="btn btn-cmd btn-disabled">@_player</button>
}
}
else
{
<button class="btn btn-cmd btn-disabled">Not Connected</button>
}
<button class="btn btn-cmd" @onclick="@(() => ReDeal())">
ReDeal
</button>
<button class="btn btn-cmd" @onclick="@(() => Leave())">Leave</button>
@if (bTable.HandLoaded > 0)
{
<button class="btn btn-cmd" @onclick="@(() => Load())">Next</button>
<button class="btn btn-cmd" @onclick="@(() => LoadPrevious())">Prev</button>
<!--ul class="list-group list-group-flush">
<li class="list-group-item"
TAKEN FROM : https://bootsnipp.com/snippets/GaxR2
>
<label-- class="switch "><input type="checkbox" @bind="_infoInput" class="success"><span class="slider round">Info</span></label-->
}
else
{
<button class="btn btn-cmd" @ondblclick="@(() => Load())">Load</button>
}
}
if (_handReceived && bTable.Contract == null)
{
<div class="input-group" style="margin-bottom:0.5em">
<input class="input-group-text" @bind="_messageInput" size="80" height="12" />
</div>
<div class="input-group">
@if (_messageInput.Length < 5)//THIS will cause the page to hang (_messageInput is NULL)
{
<button class="btn btn-cmd" @onclick="@(() => SendContract())"><p>Send Contract</p></button>
}
else
{
<button class="btn btn-cmd" @onclick="@(() => Parametric())"><p>Parametric</p></button>
}
</div>
}
}
catch (NullReferenceException e)
{
<h1>@e.Message</h1>
//LogC("HTML", e);
}
</div>
Этот код (div> был удален) будет работать (исключение будет обработано и отображено + обработка страницы будет продолжена):
<div class="text-left" style="padding:5px;">
@try
{
_relativeLeft = "0";
_relativeTop = "0";
_relativeHandTop = "0";
if (_player == Pos.UnSeated) //not even seated.
{
<button class="btn btn-cmd btn-disabled" style="color:transparent">-</button><!--place holder-->
int i = 0;
for (int j = 0; j < 4; j++) //3 to 7 %4 = to iterate 3,0,1,2 to get West on the left of the screen.
{
//DEBUG NOTE:////////////////////////////////////////////////////////////////////////////////////////////////
//DEBUG NOTE: IF the Try Catch is covered in a <div> like here, it will catch successfully and page will not hang.
//bTable.PlayIdsNew = null;
int k = j % 4;
if (bTable.PlayIdsNew[k] == "")//show only buttons that are not assigned to players.
{
<button class="btn btn-cmd" style="color:#ff6a00;font-weight:600" @onclick='(() => ReqSeat((Pos)k))'>Seat @bTable.ChrFrmPos(k)</button>
i++;
}
}
if (i == 0)//not seated and no seat available
{
<button class="btn btn-cmd" @onclick="@(() => RecoverSeat())">Recover Seat</button>
<button class="btn btn-cmd" @onclick="@(() => Reset())">Reset</button>
}
}
else //Have Seat...
{
@if (IsConnected)
{
if (bTable.Contract != null)
{
<button class="btn btn-cmd btn-disabled">@_player @bTable.Contract</button>
}
else
{
<button class="btn btn-cmd btn-disabled">@_player</button>
}
}
else
{
<button class="btn btn-cmd btn-disabled">Not Connected</button>
}
<button class="btn btn-cmd" @onclick="@(() => ReDeal())">
ReDeal
</button>
<button class="btn btn-cmd" @onclick="@(() => Leave())">Leave</button>
@if (bTable.HandLoaded > 0)
{
<button class="btn btn-cmd" @onclick="@(() => Load())">Next</button>
<button class="btn btn-cmd" @onclick="@(() => LoadPrevious())">Prev</button>
<!--ul class="list-group list-group-flush">
<li class="list-group-item"
TAKEN FROM : https://bootsnipp.com/snippets/GaxR2
>
<label-- class="switch "><input type="checkbox" @bind="_infoInput" class="success"><span class="slider round">Info</span></label-->
}
else
{
<button class="btn btn-cmd" @ondblclick="@(() => Load())">Load</button>
}
}
if (_handReceived && bTable.Contract == null)
{
<input class="input-group-text" @bind="_messageInput" size="80" height="12" />
@if (_messageInput.Length < 5)//THIS will trigger the SUCCESSFULL exception (_messageInput is NULL).
{
<button class="btn btn-cmd" @onclick="@(() => SendContract())"><p>Send Contract</p></button>
}
else
{
<button class="btn btn-cmd" @onclick="@(() => Parametric())"><p>Parametric</p></button>
}
}
}
catch (NullReferenceException e)
{
<h1>@e.Message</h1>
//LogC("HTML", e);
}