Qual seria a melhor maneira de lidar com erros em programas paralelos?


11

Com algoritmos paralelos batendo na porta, pode ser um bom momento para pensar em manipulação de erros.

Então, a princípio, havia códigos de erro. Aqueles chuparam. Era livre para ignorá-los, para que você pudesse falhar tarde e produzir código difícil de depurar.

Então vieram exceções. Aqueles eram impossíveis de ignorar quando aconteciam, e a maioria das pessoas (exceto Joel) gosta mais deles.

E agora temos bibliotecas que ajudam o código paralelo. O problema é que você não pode lidar com exceções no código paralelo da maneira mais fácil possível com o código não paralelo. Se você iniciar uma tarefa de forma assíncrona e ela lançar uma exceção, não haverá rastreamento de pilha após desanuviar; o melhor que você pode fazer é capturá-lo e registrá-lo no objeto de tarefa, se houver esse objeto. No entanto, isso derrota a força principal das exceções: você deve procurá-las e pode ignorá-las sem nenhum esforço adicional , enquanto no código de thread único uma exceção acionará necessariamente as ações apropriadas (mesmo que isso signifique encerrar seu programa).

Como as implementações ou bibliotecas de idiomas suportam erros no código paralelo?


2
Isso não deveria pertencer ao stackoverflow ?
Graviton

@Ngu Soon Hui É subjetivo e trata de recursos que não existem necessariamente, então acho que pertence aqui.
zneak

Mas é sobre programação, não programadores. :)
bzlm

1
A FAQ do @bzlm diz "Programadores - o Stack Exchange é para programadores especialistas que estão interessados ​​em discussões subjetivas sobre desenvolvimento de software". e SO desencoraja explicitamente discussões subjetivas.
Zneak 18/09/10

Respostas:


2

Gosto muito de retornos de chamada para erros que podem ser tratados. E eles podem ser feitos para funcionar muito bem de forma assíncrona ...

Mas, para erros que não podem ser tratados, erros verdadeiramente excepcionais , prefiro ver as informações relevantes salvas e o programa encerrado. Como isso geralmente é realizado por meio de algum tipo de manipulador de erros global, não vejo necessidade de transformar exceções em algo que funcione para isso - mas seria melhor um suporte melhor à plataforma para detectar erros críticos e produzir despejos de memória etc.


Eu segunda chamada de retorno. A idéia acima parece bem perfeita para mim.
Pax Noctis

-2

Parece que você gostaria de ter certeza de que a tarefa tratou de suas próprias exceções e, em seguida, retornou algo que deixou o programa de chamada saber que o encadeamento precisava ser desligado. Teria então lógica para processar o resultado de todos os threads, sabendo que alguns desses threads haviam falhado.


5
"devolvendo algo" - para quem? O chamador já mudou.
Mark H

Como o @sparkie disse, você não pode simplesmente fazer isso. Mesmo se você mantiver a pilha de chamadas como raiz da corotina, o chamador provavelmente estará muito longe. Como eu mencionei, as exceções foram projetados para que eles parar o seu programa , agora . A verificação mais tarde a derrota completamente, pois as exceções podem passar despercebidas.
zneak

@ Zneak, suponho que quando mencionei exceções, não estava usando sua definição (padrão), apenas quis dizer que o erro foi detectado. Depois que qualquer função é concluída, ela deve retornar a algum lugar; nesse ponto, a "exceção" / erro pode ser tratada (nesse nível). Não sei por que vocês estão se referindo ao programa de chamada estar longe, qualquer valor de retorno da função deve ser tratado de alguma maneira. Percebo que isso não funcionará tão bem se os resultados dos threads forem combinados entre si de forma dependente.

1
Nem todas as tarefas paralelas "retornam" em algum lugar. Por exemplo, você pode simplesmente delegar uma tarefa longa em um thread separado enquanto faz outra coisa no thread principal (incorretamente) sem nunca se perguntar se foi concluída corretamente. Por exemplo, eu poderia escrever um software de edição de imagens que grava arquivos de um encadeamento secundário e retornar da caixa de diálogo Salvar assim que a tarefa é iniciada. Não precisarei do valor de retorno, seja ele qual for, para qualquer operação adicional, portanto, exceto por erros, não há razão para verificá-lo.
zneak 18/09/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.