Комментарий:
Сериализация исключений является распространенной задачей при удаленном взаимодействии или взаимодействии с системами через границы процессов. Не слушайте никого, кто говорит иначе; они, вероятно, никогда не писали библиотеку удаленного взаимодействия.
Решение:
Я уже подключился к удаленному взаимодействию, чтобы сделать это раньше, создав собственный базовый класс исключений. Проблема, с которой я столкнулся, состояла в том, что System.Exception не сериализуется легко, поэтому мне пришлось наследовать от него. Я справился с этим, создав собственные исключения, которые сериализовались (через ISerializable), и обернули любое исключение System.Exception в пользовательское исключение.
Во всем коде вашего сервера вы все равно должны использовать пользовательские исключения, и все они могут основываться на вашем сериализуемом базовом типе. Это не так много работы, и вы быстро создадите общую библиотеку исключений для сквозного.
Слой, который вы записываете в очередь (и считываете из него), должен выполнять всю сериализацию / гидратацию исключений. Вы можете рассмотреть что-то вроде этого:
public class WireObject<T, E>
{
public T Payload{get;set;}
public E Exception{get;set;}
}
Серверный и клиентский уровни, которые общаются с вашей очередью, обернут объект, который вы отправляете в полезную нагрузку, или прикрепите исключение (если есть). Когда данные используются из очереди, клиентский уровень может проверить наличие исключения и повторно выдать его, если он есть, в противном случае передать вам ваши данные.
Это очень простая версия того, что я написал раньше, и того, что, как я видел, пишут другие. Удачи в вашем проекте.