 C# 
-  Exception x Error
C# 
-  Exception x Error 
|  | Hoje veremos os conceitos de Exception e Error e qual a diferença entre eles, se que há alguma diferença. |  | 
Geralmente usamos as palavras Exception e Error de forma intercambiável, como se tivessem o mesmo significado.
| Mas será que isso esta correto ? Os conceitos de Exception e Error são mesmo iguais ? Os conceitos são iguais. | 
		 | 
Uma Exception é um erro que é esperado ou conhecido e que pode ser tratado em tempo de execução. Sendo uma condição excepcional que altera o fluxo normal do programa e que pode ser prevista. Ex: Arquivo não encontrado, falha na conexão, falha ao gravar no banco de dados, etc.
Uma 
exceção é um objeto de um tipo derivado da classe 
System.Exception. Um SystemException é 
lançado pelo CLR (Common Language Runtime) quando 
ocorrem erros não-fatais e recuperáveis pelos programas do usuário. 
Um Error é uma ocorrência inesperada que não pode ser tratada em tempo de 
execução. Representa uma situação anormal que não era esperada. 
Assim 
erros são exceções não verificadas e o desenvolvedor não é obrigado a fazer nada 
para tratar um erro.
Os erros normalmente tendem a sinalizar o final do programa, normalmente não 
podem ser recuperados e devem fazer com que você saia do programa atual. Não 
deve ser tratado ou manuseado.
Assim, todos os erros são exceções, mas o inverso não é verdadeiro. Em geral, os erros são situações que ninguém pode controlar ou prever quando vai ocorrer, por outro lado, uma exceção pode ser prevista e pode ser tratada.
Tipos de Erros
Classes de Exceções
Uma dos pontos básicos para um software robusto é um bom tratamento de exceções. É uma boa prática sempre estar na defesa como seu código. Você tem que supor que tudo pode falhar e atuar de forma a prever e tratar os possíveis casos onde as exceções podem ocorrer. Assim se você precisa abrir um arquivo para realizar uma operação tem que prever situações nais quais a localização e a abertura do arquivo podem falhar.
Se você não lidar com possíveis cenários de erro, inevitavelmente eles acontecerão e seus usuários terão problemas., alguns deles podem ser erros do usuário e pode não haver nada que você possa fazer sobre eles.
As exceções C# são representadas por classes. As classes de exceção em C# são direta ou indiretamente derivadas da classe System.Exception.
A classe
Exception é a classe base da qual todas as outras 
exceções herdam e ela fornece várias propriedades úteis que auxiliam no 
tratamento de exceções:
- StackTrace: um rastreamento de pilha para ver exatamente onde ocorreu a 
exceção.
- InnerException: Útil quando as exceções estão encadeadas. Isso permite 
que um tipo de exceção lance outro tipo de exceção, ad infinitum.
- Message: A mensagem detalhada indicando o que aconteceu.
- Data: Um dicionário que pode ser usado para armazenar dados arbitrários 
associados a essa instância de exceção específica.
Algumas das classes de exceção derivadas da classe
System.Exception são as 
classes System.ApplicationException e 
System.SystemException.
A tabela a seguir fornece algumas das classes de exceção predefinidas derivadas 
da classe Sytem.SystemException :
| Classe de Exceção e Descrição | 
|---|
| System.IO.IOException - Trata erro de I/O. | 
| System.IndexOutOfRangeException - Trata erro gerado por uma referência a um índice de um array fora do escopo. | 
| System.ArrayTypeMismatchException - Trata erros gerados quando o tipo incompatível com o tipo Array. | 
| System.NullReferenceException - Trata erros gerados a partir da referência a objetos null. | 
| System.DivideByZeroException - Trata erros gerados pela divisão por zero. | 
| System.InvalidCastException - Trata erros gerados durante a conversão de tipos | 
| System.OutOfMemoryException - Trata erros gerados a partir de memória insuficiente | 
| System.StackOverflowException - Trata erro gerados a partir do estoura da pilha | 
Você deve 
derivar suas exceções personalizadas da classe Exception em vez da classe
ApplicationException. Assim, você não deve lançar uma exceção 
ApplicationException em seu código e não deve capturar uma exceção 
ApplicationException, a menos que pretenda lançar novamente a exceção 
original.
Uma razão simples para isso é que existem outras classes de exceção na 
plataforma .NET derivadas de ApplicationException. Se você lançar 
ApplicationException em seu código e capturá-la mais tarde, também poderá 
capturar as exceções derivadas que podem interromper seu aplicativo.
E se você pretende gerar uma exceção personalizada considere usar um tipo de exceção existente no .NET Framework em vez de fazer a sua implementação.
A seguir temos alguns dos principais tipos de exceções comuns e as condições sob as quais gerá-los:
Você deve considerar a implementação de exceções personalizadas nos seguintes cenários:
Nestes casos um roteiro básico a seguir seria:
Evite lancar exceções
Lançar ou manipular uma exceção consome uma quantidade significativa de recursos do sistema e de tempo de execução.
Você deve lançar exceções somente para lidar com condições realmente extraordinárias e não para manipular eventos previsíveis ou de fluxo de controle. Assim você não deve gerar uma exceção para entradas inválidas do usuário e sim deve direcionar os usuários para inserir novamente os dados.
E estamos conversados...

"E também todos os que 
piamente querem viver em Cristo Jesus padecerão perseguições.
Mas os homens maus e enganadores irão de mal para pior, enganando e sendo 
enganados."
2 Timóteo 3:12,13
| Veja os 
    Destaques e novidades do SUPER DVD Visual Basic 
(sempre atualizado) : clique e confira ! Quer migrar para o VB .NET ? 
 Quer aprender C# ?? 
 Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? | 
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a 
Objetos com VB .NET

https://msdn.microsoft.com/en-us/library/System.ApplicationException
https://msdn.microsoft.com/pt-br/library/system.exception(v=vs.110).aspx