Bonsoir à tous,
achevant l'écriture de ma bibliothèque servant à utiliser l'API DirectShow,
j'en arrive au sujet un peu brulant pour moi que sont les exceptions...
Je ne sais pas comment les implémenter correctement.
J'ai distingué trois types d'exception qui peuvent être levées:
1) Les exceptions qui surgissent pendant l'initialisation des modules et
qui interdisent l'utilisation du module (initialisation d'un filtre qui
échoue par exemple, ou bien tentative de connecter deux filtres qui ne
peuvent pas être mis en relation ensemble)
2) Les exceptions qui surgissent lors de l'utilisation d'un module, mais
qui n'entravent pas son fonctionnement (impossibilité de se déplacer dans
une vidéo manuellement par exemple, impossibilité d'extraire une image
d'une vidéo)
3) Les exceptions qui sont levées suite à une action de l'utilisateur du
programme final (Problème dans le choix d'un fichier par exemple (un ZIP au
lieu d'un AVI))
Les exceptions de la première catégorie sont plutôt destinés au programmeur
qui utilise la bibliothèque et n'aident en rien l'utilisateur du programme
final, puisqu'il ne pourra rien modifier.
Les exceptions de la deuxième catégorie peuvent être utiles à l'utilisateur
de la librairie et à l'utilisateur du programme
Enfin les exceptions de la dernière catégorie sont exclusivement destinées
à l'utilisateur du programme, afin qu'il change de fichier qui doit être lu
par exemple.
Bref toujours est-il que je ne sais pas comment m'y prendre...
Est-ce que je dois encadrer les fonctions susceptibles de lever une
exception par un try catch()? Lesquelles?
Est-ce à l'utilisateur de la bibiliothèque de le faire?
L'utilisateur du programme?
Ou bien je laisse les exceptions se déclencher et c'est au programmeur de
se débrouiller comme il veut?
Un peu d'aide serait la bienvenue :)
Merci d'avance
Michael
Bonsoir à tous,
achevant l'écriture de ma bibliothèque servant à utiliser l'API DirectShow,
j'en arrive au sujet un peu brulant pour moi que sont les exceptions...
Je ne sais pas comment les implémenter correctement.
J'ai distingué trois types d'exception qui peuvent être levées:
1) Les exceptions qui surgissent pendant l'initialisation des modules et
qui interdisent l'utilisation du module (initialisation d'un filtre qui
échoue par exemple, ou bien tentative de connecter deux filtres qui ne
peuvent pas être mis en relation ensemble)
2) Les exceptions qui surgissent lors de l'utilisation d'un module, mais
qui n'entravent pas son fonctionnement (impossibilité de se déplacer dans
une vidéo manuellement par exemple, impossibilité d'extraire une image
d'une vidéo)
3) Les exceptions qui sont levées suite à une action de l'utilisateur du
programme final (Problème dans le choix d'un fichier par exemple (un ZIP au
lieu d'un AVI))
Les exceptions de la première catégorie sont plutôt destinés au programmeur
qui utilise la bibliothèque et n'aident en rien l'utilisateur du programme
final, puisqu'il ne pourra rien modifier.
Les exceptions de la deuxième catégorie peuvent être utiles à l'utilisateur
de la librairie et à l'utilisateur du programme
Enfin les exceptions de la dernière catégorie sont exclusivement destinées
à l'utilisateur du programme, afin qu'il change de fichier qui doit être lu
par exemple.
Bref toujours est-il que je ne sais pas comment m'y prendre...
Est-ce que je dois encadrer les fonctions susceptibles de lever une
exception par un try catch()? Lesquelles?
Est-ce à l'utilisateur de la bibiliothèque de le faire?
L'utilisateur du programme?
Ou bien je laisse les exceptions se déclencher et c'est au programmeur de
se débrouiller comme il veut?
Un peu d'aide serait la bienvenue :)
Merci d'avance
Michael
Bonsoir à tous,
achevant l'écriture de ma bibliothèque servant à utiliser l'API DirectShow,
j'en arrive au sujet un peu brulant pour moi que sont les exceptions...
Je ne sais pas comment les implémenter correctement.
J'ai distingué trois types d'exception qui peuvent être levées:
1) Les exceptions qui surgissent pendant l'initialisation des modules et
qui interdisent l'utilisation du module (initialisation d'un filtre qui
échoue par exemple, ou bien tentative de connecter deux filtres qui ne
peuvent pas être mis en relation ensemble)
2) Les exceptions qui surgissent lors de l'utilisation d'un module, mais
qui n'entravent pas son fonctionnement (impossibilité de se déplacer dans
une vidéo manuellement par exemple, impossibilité d'extraire une image
d'une vidéo)
3) Les exceptions qui sont levées suite à une action de l'utilisateur du
programme final (Problème dans le choix d'un fichier par exemple (un ZIP au
lieu d'un AVI))
Les exceptions de la première catégorie sont plutôt destinés au programmeur
qui utilise la bibliothèque et n'aident en rien l'utilisateur du programme
final, puisqu'il ne pourra rien modifier.
Les exceptions de la deuxième catégorie peuvent être utiles à l'utilisateur
de la librairie et à l'utilisateur du programme
Enfin les exceptions de la dernière catégorie sont exclusivement destinées
à l'utilisateur du programme, afin qu'il change de fichier qui doit être lu
par exemple.
Bref toujours est-il que je ne sais pas comment m'y prendre...
Est-ce que je dois encadrer les fonctions susceptibles de lever une
exception par un try catch()? Lesquelles?
Est-ce à l'utilisateur de la bibiliothèque de le faire?
L'utilisateur du programme?
Ou bien je laisse les exceptions se déclencher et c'est au programmeur de
se débrouiller comme il veut?
Un peu d'aide serait la bienvenue :)
Merci d'avance
Michael
La question que je me pose en fait est la suivante:
* A qui sont destinées les exceptions? Au concepteur de bibliothèque, à
l'utilisateur de la bibliothèque, ou au client final?
Par exemple, voici une fonction tirée de la bibliothèque (c'est une
fonction utilisée à l'intérieur de la bibilothèque, qui n'est pas
accessible à l'utilisateur)
//-------------------------------------------------------------------------
void OutputFileDVType2::ConnectToVideoDevice(CComPtr<IBaseFilter> &
pDevice)
{
assert(CheckInputDeviceIsDVCam() == true);
/* Check if the device is the smart tee filter or the real capture device
The process is different in case of the smart tee filter, because we must
use
Dshow::Func::GetPinCategory with NULL parameters on its pin, because the
output pins of the Smart Tee
don't support IEnumMediaTypes and IKsPropertySet. */
CComPtr<IPin> pPinDeviceOutput;
GUID deviceCateg;
if (FAILED(pDevice->GetClassID(&deviceCateg)))
{
//Exception
}
if (deviceCateg == CLSID_SmartTee)
DShow::Func::GetPin(pDevice,NULL,PINDIR_OUTPUT,NULL,pPinDeviceOutput);
else
DShow::Func::GetPin(pDevice,&MEDIATYPE_Interleaved,PINDIR_OUTPUT,
&PIN_CATEGORY_CAPTURE,pPinDeviceOutput);
if (pPinDeviceOutput == NULL)
{
//Exception
}
if (FAILED(Func::ConnectFilters(pGraph,pPinDeviceOutput,pDVSplit)))
{
//Exception
}
//Connect the DV Splitter to the AVI Mux (twice)
if (FAILED(Func::ConnectFilters(pGraph,pDVSplit,pFilter)))
{
//Exception
}
if (FAILED(Func::ConnectFilters(pGraph,pDVSplit,pFilter)))
{
//Exception
}
}
Je me rends compte en fait que les exceptions que je pourrais lancer ici
n'intéressent qu'une seule personne : Moi !! En effet elles me
permettraient de savoir où se trouve une erreur dans le code (Par exemple
quels sont les filtres que je tente de mettre en relation alors qu'ils ne
le devraient pas...)
Mais je me dis que ce pourrait être intéressant de les laisser, ce qui
permettrait à l'utilisateur de la bibliothèque ou à l'utilisateur final de
faire remonter des "codes d'erreur" lancés par les exceptions...
Pour moi écrire la bibliothèque et vérifier que ce que je fais est bon,
est-ce que des simples assert sont suffisants? Auquel cas le code précédent
deviendrait
//-------------------------------------------------------------------------
void OutputFileDVType2::ConnectToVideoDevice(CComPtr<IBaseFilter> &
pDevice)
{
assert(CheckInputDeviceIsDVCam() == true);
/* Check if the device is the smart tee filter or the real capture device
The process is different in case of the smart tee filter, because we must
use
Dshow::Func::GetPinCategory with NULL parameters on its pin, because the
output pins of the Smart Tee
don't support IEnumMediaTypes and IKsPropertySet. */
CComPtr<IPin> pPinDeviceOutput;
GUID deviceCateg;
assert(pDevice->GetClassID(&deviceCateg));
if (deviceCateg == CLSID_SmartTee)
DShow::Func::GetPin(pDevice,NULL,PINDIR_OUTPUT,NULL,pPinDeviceOutput);
else
DShow::Func::GetPin(pDevice,&MEDIATYPE_Interleaved,PINDIR_OUTPUT,
&PIN_CATEGORY_CAPTURE,pPinDeviceOutput);
assert(pPinDeviceOutput != NULL);
assert(Func::ConnectFilters(pGraph,pPinDeviceOutput,pDVSplit));
//Connect the DV Splitter to the AVI Mux (twice)
assert(Func::ConnectFilters(pGraph,pDVSplit,pFilter));
assert(Func::ConnectFilters(pGraph,pDVSplit,pFilter));
}
Et ne lancer des exceptions que lors des fonctions utilisées par
l'utilisateur de la bibliothèque?
La question que je me pose en fait est la suivante:
* A qui sont destinées les exceptions? Au concepteur de bibliothèque, à
l'utilisateur de la bibliothèque, ou au client final?
Par exemple, voici une fonction tirée de la bibliothèque (c'est une
fonction utilisée à l'intérieur de la bibilothèque, qui n'est pas
accessible à l'utilisateur)
//-------------------------------------------------------------------------
void OutputFileDVType2::ConnectToVideoDevice(CComPtr<IBaseFilter> &
pDevice)
{
assert(CheckInputDeviceIsDVCam() == true);
/* Check if the device is the smart tee filter or the real capture device
The process is different in case of the smart tee filter, because we must
use
Dshow::Func::GetPinCategory with NULL parameters on its pin, because the
output pins of the Smart Tee
don't support IEnumMediaTypes and IKsPropertySet. */
CComPtr<IPin> pPinDeviceOutput;
GUID deviceCateg;
if (FAILED(pDevice->GetClassID(&deviceCateg)))
{
//Exception
}
if (deviceCateg == CLSID_SmartTee)
DShow::Func::GetPin(pDevice,NULL,PINDIR_OUTPUT,NULL,pPinDeviceOutput);
else
DShow::Func::GetPin(pDevice,&MEDIATYPE_Interleaved,PINDIR_OUTPUT,
&PIN_CATEGORY_CAPTURE,pPinDeviceOutput);
if (pPinDeviceOutput == NULL)
{
//Exception
}
if (FAILED(Func::ConnectFilters(pGraph,pPinDeviceOutput,pDVSplit)))
{
//Exception
}
//Connect the DV Splitter to the AVI Mux (twice)
if (FAILED(Func::ConnectFilters(pGraph,pDVSplit,pFilter)))
{
//Exception
}
if (FAILED(Func::ConnectFilters(pGraph,pDVSplit,pFilter)))
{
//Exception
}
}
Je me rends compte en fait que les exceptions que je pourrais lancer ici
n'intéressent qu'une seule personne : Moi !! En effet elles me
permettraient de savoir où se trouve une erreur dans le code (Par exemple
quels sont les filtres que je tente de mettre en relation alors qu'ils ne
le devraient pas...)
Mais je me dis que ce pourrait être intéressant de les laisser, ce qui
permettrait à l'utilisateur de la bibliothèque ou à l'utilisateur final de
faire remonter des "codes d'erreur" lancés par les exceptions...
Pour moi écrire la bibliothèque et vérifier que ce que je fais est bon,
est-ce que des simples assert sont suffisants? Auquel cas le code précédent
deviendrait
//-------------------------------------------------------------------------
void OutputFileDVType2::ConnectToVideoDevice(CComPtr<IBaseFilter> &
pDevice)
{
assert(CheckInputDeviceIsDVCam() == true);
/* Check if the device is the smart tee filter or the real capture device
The process is different in case of the smart tee filter, because we must
use
Dshow::Func::GetPinCategory with NULL parameters on its pin, because the
output pins of the Smart Tee
don't support IEnumMediaTypes and IKsPropertySet. */
CComPtr<IPin> pPinDeviceOutput;
GUID deviceCateg;
assert(pDevice->GetClassID(&deviceCateg));
if (deviceCateg == CLSID_SmartTee)
DShow::Func::GetPin(pDevice,NULL,PINDIR_OUTPUT,NULL,pPinDeviceOutput);
else
DShow::Func::GetPin(pDevice,&MEDIATYPE_Interleaved,PINDIR_OUTPUT,
&PIN_CATEGORY_CAPTURE,pPinDeviceOutput);
assert(pPinDeviceOutput != NULL);
assert(Func::ConnectFilters(pGraph,pPinDeviceOutput,pDVSplit));
//Connect the DV Splitter to the AVI Mux (twice)
assert(Func::ConnectFilters(pGraph,pDVSplit,pFilter));
assert(Func::ConnectFilters(pGraph,pDVSplit,pFilter));
}
Et ne lancer des exceptions que lors des fonctions utilisées par
l'utilisateur de la bibliothèque?
La question que je me pose en fait est la suivante:
* A qui sont destinées les exceptions? Au concepteur de bibliothèque, à
l'utilisateur de la bibliothèque, ou au client final?
Par exemple, voici une fonction tirée de la bibliothèque (c'est une
fonction utilisée à l'intérieur de la bibilothèque, qui n'est pas
accessible à l'utilisateur)
//-------------------------------------------------------------------------
void OutputFileDVType2::ConnectToVideoDevice(CComPtr<IBaseFilter> &
pDevice)
{
assert(CheckInputDeviceIsDVCam() == true);
/* Check if the device is the smart tee filter or the real capture device
The process is different in case of the smart tee filter, because we must
use
Dshow::Func::GetPinCategory with NULL parameters on its pin, because the
output pins of the Smart Tee
don't support IEnumMediaTypes and IKsPropertySet. */
CComPtr<IPin> pPinDeviceOutput;
GUID deviceCateg;
if (FAILED(pDevice->GetClassID(&deviceCateg)))
{
//Exception
}
if (deviceCateg == CLSID_SmartTee)
DShow::Func::GetPin(pDevice,NULL,PINDIR_OUTPUT,NULL,pPinDeviceOutput);
else
DShow::Func::GetPin(pDevice,&MEDIATYPE_Interleaved,PINDIR_OUTPUT,
&PIN_CATEGORY_CAPTURE,pPinDeviceOutput);
if (pPinDeviceOutput == NULL)
{
//Exception
}
if (FAILED(Func::ConnectFilters(pGraph,pPinDeviceOutput,pDVSplit)))
{
//Exception
}
//Connect the DV Splitter to the AVI Mux (twice)
if (FAILED(Func::ConnectFilters(pGraph,pDVSplit,pFilter)))
{
//Exception
}
if (FAILED(Func::ConnectFilters(pGraph,pDVSplit,pFilter)))
{
//Exception
}
}
Je me rends compte en fait que les exceptions que je pourrais lancer ici
n'intéressent qu'une seule personne : Moi !! En effet elles me
permettraient de savoir où se trouve une erreur dans le code (Par exemple
quels sont les filtres que je tente de mettre en relation alors qu'ils ne
le devraient pas...)
Mais je me dis que ce pourrait être intéressant de les laisser, ce qui
permettrait à l'utilisateur de la bibliothèque ou à l'utilisateur final de
faire remonter des "codes d'erreur" lancés par les exceptions...
Pour moi écrire la bibliothèque et vérifier que ce que je fais est bon,
est-ce que des simples assert sont suffisants? Auquel cas le code précédent
deviendrait
//-------------------------------------------------------------------------
void OutputFileDVType2::ConnectToVideoDevice(CComPtr<IBaseFilter> &
pDevice)
{
assert(CheckInputDeviceIsDVCam() == true);
/* Check if the device is the smart tee filter or the real capture device
The process is different in case of the smart tee filter, because we must
use
Dshow::Func::GetPinCategory with NULL parameters on its pin, because the
output pins of the Smart Tee
don't support IEnumMediaTypes and IKsPropertySet. */
CComPtr<IPin> pPinDeviceOutput;
GUID deviceCateg;
assert(pDevice->GetClassID(&deviceCateg));
if (deviceCateg == CLSID_SmartTee)
DShow::Func::GetPin(pDevice,NULL,PINDIR_OUTPUT,NULL,pPinDeviceOutput);
else
DShow::Func::GetPin(pDevice,&MEDIATYPE_Interleaved,PINDIR_OUTPUT,
&PIN_CATEGORY_CAPTURE,pPinDeviceOutput);
assert(pPinDeviceOutput != NULL);
assert(Func::ConnectFilters(pGraph,pPinDeviceOutput,pDVSplit));
//Connect the DV Splitter to the AVI Mux (twice)
assert(Func::ConnectFilters(pGraph,pDVSplit,pFilter));
assert(Func::ConnectFilters(pGraph,pDVSplit,pFilter));
}
Et ne lancer des exceptions que lors des fonctions utilisées par
l'utilisateur de la bibliothèque?
Pour la hirarchie, je ferais trois classes abstraites drivant
directement de std::exception, une par type d'exception, de faon
permettre l'utilisateur de ta lib (i.e. le programmeur) d'intercepter
l'exceptions pertinente o il le veut (par exemple grer les exceptions
utilisateur de manire centralise pour avoir un affichage, les
exceptions qui lui sont destines aux endroits o il pourra y faire
qqch, et les exceptions graves pourront ventuellement donner lieu un
traitement entrainant la fermeture du programme ...).
Pour la hirarchie, je ferais trois classes abstraites drivant
directement de std::exception, une par type d'exception, de faon
permettre l'utilisateur de ta lib (i.e. le programmeur) d'intercepter
l'exceptions pertinente o il le veut (par exemple grer les exceptions
utilisateur de manire centralise pour avoir un affichage, les
exceptions qui lui sont destines aux endroits o il pourra y faire
qqch, et les exceptions graves pourront ventuellement donner lieu un
traitement entrainant la fermeture du programme ...).
Pour la hirarchie, je ferais trois classes abstraites drivant
directement de std::exception, une par type d'exception, de faon
permettre l'utilisateur de ta lib (i.e. le programmeur) d'intercepter
l'exceptions pertinente o il le veut (par exemple grer les exceptions
utilisateur de manire centralise pour avoir un affichage, les
exceptions qui lui sont destines aux endroits o il pourra y faire
qqch, et les exceptions graves pourront ventuellement donner lieu un
traitement entrainant la fermeture du programme ...).
Pierre Barbier de Reuille wrote in news:44e2590c
$0$18265$:Pour la hirarchie, je ferais trois classes abstraites drivant
directement de std::exception, une par type d'exception, de faon
permettre l'utilisateur de ta lib (i.e. le programmeur) d'intercepter
l'exceptions pertinente o il le veut (par exemple grer les exceptions
utilisateur de manire centralise pour avoir un affichage, les
exceptions qui lui sont destines aux endroits o il pourra y faire
qqch, et les exceptions graves pourront ventuellement donner lieu un
traitement entrainant la fermeture du programme ...).
Donc le mieux c'est que tout type d'erreur passe par une exception, puisque
par exemple si dans la lib il est impossible de créer un objet qui doit être
utilisé, il est inutile d'aller plus loin. Et autant avertir tout le monde de
ce qui a foiré.
Quant aux assert, je les utiliserai pour vérifier que les paramètres entrés
par l'utilisateur de la lib sont corrects...
Pierre Barbier de Reuille <p.barbierdereuille@free.fr> wrote in news:44e2590c
$0$18265$636a55ce@news.free.fr:
Pour la hirarchie, je ferais trois classes abstraites drivant
directement de std::exception, une par type d'exception, de faon
permettre l'utilisateur de ta lib (i.e. le programmeur) d'intercepter
l'exceptions pertinente o il le veut (par exemple grer les exceptions
utilisateur de manire centralise pour avoir un affichage, les
exceptions qui lui sont destines aux endroits o il pourra y faire
qqch, et les exceptions graves pourront ventuellement donner lieu un
traitement entrainant la fermeture du programme ...).
Donc le mieux c'est que tout type d'erreur passe par une exception, puisque
par exemple si dans la lib il est impossible de créer un objet qui doit être
utilisé, il est inutile d'aller plus loin. Et autant avertir tout le monde de
ce qui a foiré.
Quant aux assert, je les utiliserai pour vérifier que les paramètres entrés
par l'utilisateur de la lib sont corrects...
Pierre Barbier de Reuille wrote in news:44e2590c
$0$18265$:Pour la hirarchie, je ferais trois classes abstraites drivant
directement de std::exception, une par type d'exception, de faon
permettre l'utilisateur de ta lib (i.e. le programmeur) d'intercepter
l'exceptions pertinente o il le veut (par exemple grer les exceptions
utilisateur de manire centralise pour avoir un affichage, les
exceptions qui lui sont destines aux endroits o il pourra y faire
qqch, et les exceptions graves pourront ventuellement donner lieu un
traitement entrainant la fermeture du programme ...).
Donc le mieux c'est que tout type d'erreur passe par une exception, puisque
par exemple si dans la lib il est impossible de créer un objet qui doit être
utilisé, il est inutile d'aller plus loin. Et autant avertir tout le monde de
ce qui a foiré.
Quant aux assert, je les utiliserai pour vérifier que les paramètres entrés
par l'utilisateur de la lib sont corrects...
Voilà, pour moi la distinction est:
- Exception : erreur d'utilisation ou matérielle
- Assert : pour vérifier que *je* ne me suis pas trompé quelque part,
de toute façon ce sera supprimé dans la version finale (sans avoir rien
à faire, l'entête <cassert> définit la macro assert comme une fonction
vide si la compilation n'est pas en debug ...)
Voilà, pour moi la distinction est:
- Exception : erreur d'utilisation ou matérielle
- Assert : pour vérifier que *je* ne me suis pas trompé quelque part,
de toute façon ce sera supprimé dans la version finale (sans avoir rien
à faire, l'entête <cassert> définit la macro assert comme une fonction
vide si la compilation n'est pas en debug ...)
Voilà, pour moi la distinction est:
- Exception : erreur d'utilisation ou matérielle
- Assert : pour vérifier que *je* ne me suis pas trompé quelque part,
de toute façon ce sera supprimé dans la version finale (sans avoir rien
à faire, l'entête <cassert> définit la macro assert comme une fonction
vide si la compilation n'est pas en debug ...)
Voilà, pour moi la distinction est:
- Exception : erreur d'utilisation ou matérielle
- Assert : pour vérifier que *je* ne me suis pas trompé quelque part,
de toute façon ce sera supprimé dans la version finale (sans avoir rien
à faire, l'entête <cassert> définit la macro assert comme une fonction
vide si la compilation n'est pas en debug ...)
Concernant la définition des exceptions, est-ce que ceci est utilisé (il y
a des erreurs, mais l'idée est là)(et c'est prévu pour Borland C++ Builder
6)
class DSException : public Exception
{
private:
HRESULT hr;
public:
DSException(HRESULT hr_)
: hr(hr_),Exception("")
{
Message = "DirectShow Errorrn";
Message += "Error Code : " + hr + "rn";
}
};
//------------------------------------------------------------------------
class CoCreateException : public DSException
{
private:
LPOLESTR classString;
public:
CoCreateException(HRESULT hr, const GUID & clsid)
: DSException(hr),classString(NULL)
{
StringFromCLSID(clsid,&classString);
Message += "CoCreateInstanceError with : " + classString;
}
};
De telle sorte que lorsqu'une exception est lancée, le message affiché soit
clair pour tout le monde.
Voilà, pour moi la distinction est:
- Exception : erreur d'utilisation ou matérielle
- Assert : pour vérifier que *je* ne me suis pas trompé quelque part,
de toute façon ce sera supprimé dans la version finale (sans avoir rien
à faire, l'entête <cassert> définit la macro assert comme une fonction
vide si la compilation n'est pas en debug ...)
Concernant la définition des exceptions, est-ce que ceci est utilisé (il y
a des erreurs, mais l'idée est là)(et c'est prévu pour Borland C++ Builder
6)
class DSException : public Exception
{
private:
HRESULT hr;
public:
DSException(HRESULT hr_)
: hr(hr_),Exception("")
{
Message = "DirectShow Errorrn";
Message += "Error Code : " + hr + "rn";
}
};
//------------------------------------------------------------------------
class CoCreateException : public DSException
{
private:
LPOLESTR classString;
public:
CoCreateException(HRESULT hr, const GUID & clsid)
: DSException(hr),classString(NULL)
{
StringFromCLSID(clsid,&classString);
Message += "CoCreateInstanceError with : " + classString;
}
};
De telle sorte que lorsqu'une exception est lancée, le message affiché soit
clair pour tout le monde.
Voilà, pour moi la distinction est:
- Exception : erreur d'utilisation ou matérielle
- Assert : pour vérifier que *je* ne me suis pas trompé quelque part,
de toute façon ce sera supprimé dans la version finale (sans avoir rien
à faire, l'entête <cassert> définit la macro assert comme une fonction
vide si la compilation n'est pas en debug ...)
Concernant la définition des exceptions, est-ce que ceci est utilisé (il y
a des erreurs, mais l'idée est là)(et c'est prévu pour Borland C++ Builder
6)
class DSException : public Exception
{
private:
HRESULT hr;
public:
DSException(HRESULT hr_)
: hr(hr_),Exception("")
{
Message = "DirectShow Errorrn";
Message += "Error Code : " + hr + "rn";
}
};
//------------------------------------------------------------------------
class CoCreateException : public DSException
{
private:
LPOLESTR classString;
public:
CoCreateException(HRESULT hr, const GUID & clsid)
: DSException(hr),classString(NULL)
{
StringFromCLSID(clsid,&classString);
Message += "CoCreateInstanceError with : " + classString;
}
};
De telle sorte que lorsqu'une exception est lancée, le message affiché soit
clair pour tout le monde.
Non, initialise toujours la classe de base *avant*
les variables locales:
Non, initialise toujours la classe de base *avant*
les variables locales:
Non, initialise toujours la classe de base *avant*
les variables locales:
De toutes façons, quelle que soit la tronche de la liste
d'initialisation, les classes de base sont initialisées d'abord, puis
vient le tour des variables membres, dans l'ordre de déclaration dans
la classe.
De toutes façons, quelle que soit la tronche de la liste
d'initialisation, les classes de base sont initialisées d'abord, puis
vient le tour des variables membres, dans l'ordre de déclaration dans
la classe.
De toutes façons, quelle que soit la tronche de la liste
d'initialisation, les classes de base sont initialisées d'abord, puis
vient le tour des variables membres, dans l'ordre de déclaration dans
la classe.
On Wed, 16 Aug 2006 11:48:55 +0100, Pierre Barbier de Reuille
:Non, initialise toujours la classe de base *avant*
De toutes façons, quelle que soit la tronche de la liste
d'initialisation, les classes de base sont initialisées d'abord, puis
vient le tour des variables membres, dans l'ordre de déclaration dans
la classe.les variables locales:
Attention, les variables locales ne sont pas ce que tu sembles croire.
Il s'agit des paramètres de la fonction (ici, "hr_"), ainsi que des
variables déclarées dans le corps de la fonction.
On Wed, 16 Aug 2006 11:48:55 +0100, Pierre Barbier de Reuille
<p.barbierdereuille@free.fr>:
Non, initialise toujours la classe de base *avant*
De toutes façons, quelle que soit la tronche de la liste
d'initialisation, les classes de base sont initialisées d'abord, puis
vient le tour des variables membres, dans l'ordre de déclaration dans
la classe.
les variables locales:
Attention, les variables locales ne sont pas ce que tu sembles croire.
Il s'agit des paramètres de la fonction (ici, "hr_"), ainsi que des
variables déclarées dans le corps de la fonction.
On Wed, 16 Aug 2006 11:48:55 +0100, Pierre Barbier de Reuille
:Non, initialise toujours la classe de base *avant*
De toutes façons, quelle que soit la tronche de la liste
d'initialisation, les classes de base sont initialisées d'abord, puis
vient le tour des variables membres, dans l'ordre de déclaration dans
la classe.les variables locales:
Attention, les variables locales ne sont pas ce que tu sembles croire.
Il s'agit des paramètres de la fonction (ici, "hr_"), ainsi que des
variables déclarées dans le corps de la fonction.