AngularJS - por que promete ($ q) com $ http?

Estou aprendendo o AngularJS após converter do jQuery por alguns anos. E alguns bits são muito mais intuitivos. Alguns nem tanto :).

Estou tentando entender o uso de promessas, principalmente $ q em uso com $ http e não parece haver muita informação sobre essas duas combinadas que eu possa encontrar.

Por que eu usaria promessas no lugar do retorno de chamada de sucesso / erro? Ambos fazem uso de retornos de chamada na realidade, então por que uma promessa é considerada melhor? Por exemplo. Eu poderia montar umget(...) funcionar da seguinte maneira:

function get(url, success, error) {
    success = success || function () {};
    error = error || function () {};

    $http.get(url)
        .success(function (data) {
            success(data);
        })
        .error(function (error) {
            error(error);
        });
}

get('http://myservice.com/JSON/',
    function () {
        // do something with data
    },
    function () {
        // display an error
    }
);

O que é bom (?) Porque me dá controle completo sobre o que está acontecendo. Se eu ligarget(...) então eu posso controlar qualquer sucesso / erro onde quer queget é chamado.

Se eu converter isso para usar promessas, então recebo:

function get(url) {
    return $http.get(url)
        .then(function (data) {
            return data;
        },
        function (error) {
            return error;
        });
}

get('http://myservice.com/JSON/')
    .then(function (data) {
        // do something with data
    });
    // cannot handle my errors?

O que está condensado, eu concordo; também não precisamos nos preocupar explicitamente com o retorno de chamada de sucesso / erro, mas parece que perdi o controle sobre o retorno de chamada de erro para começar - porque não consigo configurar um segundo retorno de chamada para lidar com um erro.

O que significa que, se eu usar essa função em um serviço que pode ser usado por vários controladores, não será possível atualizar a interface do usuário para alertar o usuário sobre um erro.

Estou esquecendo de algo? Existe uma razão pela qual as promessas são preferidas? Não consigo encontrar um exemplo do porquê.