Aconselho vivamente contra o n.º 1, porque apenas ignorar os erros é um anti-padrão perigoso. Pode levar a erros difíceis de analisar. Definir o resultado de uma divisão por zero a 0 não faz sentido algum, e continuar a execução do programa com um valor sem sentido vai causar problemas. Especialmente quando o programa está sendo executado sem supervisão. Quando o interpretador do programa percebe que há um erro no programa (e uma divisão por zero é quase sempre um erro de design), abortá-lo e manter tudo como está é normalmente preferível ao preencher seu banco de dados com lixo.
Além disso, você provavelmente não conseguirá seguir este padrão completamente. Mais cedo ou mais tarde, você encontrará situações de erro que não podem ser ignoradas (como ficar sem memória ou um estouro de pilha) e você terá que implementar uma maneira de terminar o programa de qualquer maneira.
A opção # 2 (usando NaN) seria um pouco trabalhosa, mas não tanto quanto você imagina. Como lidar com NaN em cálculos diferentes é bem documentado no padrão IEEE 754, então você pode fazer o que a linguagem em que seu interpretador está escrito faz.
A propósito: A criação de uma linguagem de programação utilizável por não-programadores é algo que estamos tentando fazer desde 1964 (Dartmouth BASIC). Até agora, não tivemos sucesso. Mas boa sorte, de qualquer maneira.