Exceções Comuns

Este guia descreve as exceções comuns que podem ser lançadas quando se trabalha com a biblioteca DotNetBrowser.

Exceções de inicialização

Exceções de licença

Estas exceções são lançadas quando a verificação da licença falha por algum motivo.

  • NoLicenseException é lançada quando a licença está em falta. Isso geralmente acontece quando nenhuma chave de licença é definida no EngineOptions, e o DotNetBrowser não consegue localizar um arquivo dotnetbrowser.license contendo a chave de licença. Para resolver este caso, verifique se a licença foi adicionada ao projeto.
  • InvalidLicenseException é lançada quando a licença está configurada corretamente, mas a verificação da licença falha. O motivo exato da falha na verificação da licença é fornecido como mensagem de exceção. Por exemplo, esta exceção pode ser lançada quando a licença está expirada ou a ligação do produto na licença não corresponde a nenhum dos namespaces.

Por exemplo, uma das mensagens possíveis InvalidLicenseException: Falha na verificação da licença do DotNetBrowser. Motivo: Esta versão do produto é incompatível com a licença. Isso significa que a chave de licença especificada no projeto é incompatível com a versão do DotNetBrowser referenciada. É necessário certificar-se de que a chave correta e válida foi utilizada.

Caso contrário, não hesite em contatar a nossa equipa de vendas em sales@teamdev.com para obter a licença atualizada.

Exceções aos binários do Chromium

A ChromiumBinariesMissingException é lançada quando o DotNetBrowser não consegue iniciar o engine Chromium vinculado porque os binários do Chromium estão em falta e não podem ser restaurados. O motivo real da exceção é fornecido como mensagem de exceção. Por exemplo, esta exceção pode ser lançada quando não são encontrados binários Chromium compatíveis na pasta Chromium binaries, e o DotNetBrowser não consegue encontrar um assembly que contenha os binários compatíveis.

Falha ao extrair os binários do Chromium no processo separado

Esta exceção é lançada quando os binários do Chromium foram encontrados na montagem, no entanto, houve um problema com a sua extração para a pasta de binários do Chromium.

Na maioria dos casos, a extração dos binários da DLL é efetuada através do GZipCompress.exe, um utilitário que faz parte do DotNetBrowser. Este utilitário pode não conseguir extrair os binários por algum motivo. Por exemplo, se estiver bloqueado por uma aplicação de terceiros (antivírus ou firewall) ou se houver falta de permissões para esta operação. A seguinte mensagem de exceção é observada neste caso: Failed to extract the Chromium binaries in the separate process. GZipCompress.exe has exited with code <exit_code>.

Quando esta exceção ocorre, o resultado detalhado do GZipCompress.exe é escrita em DotNetBrowser logs. A análise dos registros ajuda geralmente a compreender a causa real da falha.

Outras exceções na inicialização do engine

A EngineInitializationException é lançada quando algo corre mal durante a inicialização da instância IEngine.

A pasta de dados do usuário já está sendo utilizada

Não é permitido criar duas ou mais instâncias do IEngine que apontem para a mesma pasta de dados do usuário, mesmo que essas instâncias do IEngine sejam criadas em processos .NET separados. Este caso de utilização não é suportado pelo próprio Chromium e conduz a um comportamento imprevisível e a falhas súbitas do engine.

Consequentemente, quando este caso é detectado, é lançada a EngineInitializationException com a seguinte mensagem: The user data directory is already in use: <path><path>

Existem algumas soluções possíveis:

  1. Criar várias instâncias do IBrowser utilizando o mesmo IEngine:
     IEngine engine = EngineFactory.Create(engineOptions);
    
     IBrowser browser1 = engine.CreateBrowser();
     IBrowser browser2 = engine.CreateBrowser();
    
     Dim engine As IEngine = EngineFactory.Create(engineOptions)
    
     Dim browser1 As IBrowser = engine.CreateBrowser()
     Dim browser2 As IBrowser = engine.CreateBrowser()
    
  2. Crie instâncias separadas do IEngine utilizando diferentes pastas de dados do usuário:
     IEngine engine1 = EngineFactory.Create(new EngineOptions.Builder
     {
         UserDataDirectory = @"C:\Users\Me\DotNetBrowser1"
     }.Build());
    
     IEngine engine2 = EngineFactory.Create(new EngineOptions.Builder
     {
         UserDataDirectory = @"C:\Users\Me\DotNetBrowser2"
     }.Build());
    
     IBrowser browser1 = engine1.CreateBrowser();
     IBrowser browser2 = engine2.CreateBrowser();
    
     Dim engine1 As IEngine = EngineFactory.Create(New EngineOptions.Builder With 
     {
         .UserDataDirectory = "C:\Users\Me\DotNetBrowser"
     }.Build())
    
     Dim engine2 As IEngine = EngineFactory.Create(New EngineOptions.Builder With 
     {
         .UserDataDirectory = "C:\Users\Me\DotNetBrowser"
     }.Build())
    
     Dim browser1 As IBrowser = engine1.CreateBrowser()
     Dim browser2 As IBrowser = engine2.CreateBrowser()
    

Exceções em runtime

ObjectDisposedException

A ObjectDisposedException é lançada quando há uma tentativa de utilizar um objeto que já foi eliminado. Por exemplo, esta exceção é lançada quando se trabalha com:

  • algum elemento DOM ou objeto JavaScript previamente armazenado em cache depois de carregar uma página Web diferente;
  • um frame que já não existe no navegador;
  • instância IEngine, quaisquer instâncias IBrowser criadas por este engine, ou quaisquer outros objetos relacionados com essas instâncias depois do IEngine.
  • instância IEngine, quaisquer instâncias IBrowser criadas por este engine, ou quaisquer outros objetos relacionados com essas instâncias após a falha do Chromium.

ConnectionClosedException

A ConnectionClosedException é lançada quando a ligação ao engine Chromium parece estar fechada. Esta exceção está normalmente relacionada com a chamada do método IEngine.Dispose() ou uma falha do Chromium.

Operação cross-thread não válida

Quando você tenta modificar a IU no evento DotNetBrowser, você pode ver System.InvalidOperationException com a seguinte descrição: Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on...

O DotNetBrowser dispara os seus eventos através das threads separadas e não utiliza a thread principal da IU para este fim. Para modificar a IU no evento DotNetBrowser, passe a execução para a thread principal da IU utilizando Invoke e BeginInvoke em WinForms ou Dispatcher.Invoke e Dispatcher.BeginInvoke em WPF. A propriedade Control.InvokeRequired no WinForms ou a chamada Dispatcher.CheckAccess() no WPF podem ser utilizadas para verificar se é necessário passar a execução.

Os exemplos de código abaixo demonstram como obter acesso à IU a partir de outro segmento.

WinForms

browser.Navigation.FrameLoadFinished += (s, e) =>
{
    if (e.Frame.IsMain)
    {
        if (InvokeRequired)
        {
            BeginInvoke(new Action(() =>
            {
                this.Title = e.Browser.Url;
            }));
        }
        else
        {
            this.Title = e.Browser.Url;
        }
    }
};
browser.Navigation.LoadUrl("https://www.teamdev.com");
AddHandler browser.Navigation.FrameLoadFinished, Sub(s, e)
    If e.Frame.IsMain Then
        If InvokeRequired Then
            BeginInvoke(New Action(Sub()
                Me.Title = e.Browser.Url
            End Sub))
        Else
            Me.Title = e.Browser.Url
        End If
    End If
End Sub
browser.Navigation.LoadUrl("https://www.teamdev.com")

WPF

browser.Navigation.FrameLoadFinished += (s, e) =>
{
    if (e.Frame.IsMain)
    {
        if (!Dispatcher.CheckAccess())
        {
            Dispatcher.BeginInvoke(new Action(() =>
            {
                this.Title = e.Browser.Url;
            }));
        }
        else
        {
            this.Title = e.Browser.Url;
        }
    }
};
browser.Navigation.LoadUrl("https://www.teamdev.com");
AddHandler browser.Navigation.FrameLoadFinished, Sub(s, e)
    If e.Frame.IsMain Then
        If Not Dispatcher.CheckAccess() Then
            Dispatcher.BeginInvoke(New Action(Sub()
                Me.Title = e.Browser.Url
            End Sub))
        Else
            Me.Title = e.Browser.Url
        End If
    End If
End Sub
browser.Navigation.LoadUrl("https://www.teamdev.com")
Go Top