Браузер зависает, когда исключение клиента Blazor находится внутри div (попытка catch не выполняется) - PullRequest
0 голосов
/ 05 марта 2020

Код ниже является частью страницы 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);
}

...